jaxbutil.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 534 行 · 第 1/2 页

JAVA
534
字号
  public static String primitiveToWrapperName(Class cl)  {    if (cl.getName().equals("int"))      return "Integer";    else if (cl.getName().equals("char"))      return "Character";    else      return toUpperCase(cl.getName().charAt(0)) + cl.getName().substring(1);  }  /**   * Tests for punctuation according to JAXB page 334.   */  private static boolean isPunctuation(char ch)  {    return "-.:\u00B7\u0387\u06DD\u06dd\u06de_".indexOf((int) ch) >= 0;  }  /**   * Tests for "uncased" characters.   */  private static boolean isUncased(char ch)  {    return (! isLowerCase(ch)) && (! isUpperCase(ch));  }  /**   * Splits a string into XML "words" as defined by the JAXB standard.   * (see page 162 and appendix D)   *   */  private static List<StringBuilder> splitIdentifier(String identifier)  {    List<StringBuilder> words = new ArrayList<StringBuilder>();    StringBuilder word = new StringBuilder();    char lastCh = 0;    for (int i = 0; i < identifier.length(); i++) {      char ch = identifier.charAt(i);      // punctuation shouldn't be common for the java -> xml direction      if (word.length() > 0 && isPunctuation(ch)) {        words.add(word);        word = new StringBuilder();      }       else if (isDigit(ch)) {        if (word.length() > 0 && ! isDigit(lastCh)) {          words.add(word);          word = new StringBuilder();        }        word.append(ch);      }      else if (i > 0) { // all of the following need lastCh        if (isLowerCase(lastCh) && isUpperCase(ch)) {          words.add(word);          word = new StringBuilder();          word.append(ch);        }        else if (isUpperCase(lastCh) && isLowerCase(ch)) {          // need to steal the last character from the current word           // for the next word (e.g. FOOBar -> { "FOO", "Bar" })          if (word.length() > 1) {            word.deleteCharAt(word.length() - 1);            words.add(word);          }          word = new StringBuilder();          word.append(lastCh);          word.append(ch);        }        else if (isLetter(lastCh) != isLetter(ch)) {          words.add(word);          word = new StringBuilder();          word.append(ch);        }        else if (isUncased(lastCh) != isUncased(ch)) {          words.add(word);          word = new StringBuilder();          word.append(ch);        }        else          word.append(ch);      }      else        word.append(ch);      lastCh = ch;    }    if (word.length() > 0)      words.add(word);    return words;  }  public static String identifierToXmlName(Class cl)  {    List<StringBuilder> words = splitIdentifier(cl.getSimpleName());    StringBuilder xmlName = new StringBuilder();    xmlName.append(toLowerCase(words.get(0).charAt(0)));    xmlName.append(words.get(0).substring(1));    for (int i = 1; i < words.size(); i++) {      if (words.get(i).length() > 0) {        xmlName.append(toUpperCase(words.get(i).charAt(0)));        xmlName.append(words.get(i).substring(1));      }    }    return xmlName.toString();  }  public static String xmlNameToClassName(String name)  {    // XXX FIXME    if (name.length() > 1)      return toUpperCase(name.charAt(0)) + name.substring(1);    else      return toUpperCase(name.charAt(0)) + "";  }  /// XXX this is sooooooooo wrong.  It belongs in JAXBContextImpl  public static QName getXmlSchemaDatatype(Class cl, JAXBContextImpl context)  {    if (_datatypeMap.containsKey(cl))      return _datatypeMap.get(cl);    String name = null;    String namespace = context.getTargetNamespace();    Package pkg = cl.getPackage();    // look at package defaults first...    XmlSchema schema = (XmlSchema) pkg.getAnnotation(XmlSchema.class);    if (schema != null && ! "".equals(schema.namespace()))      namespace = schema.namespace();    if (cl.isAnnotationPresent(XmlType.class)) {      XmlType xmlType = (XmlType) cl.getAnnotation(XmlType.class);      if (! "##default".equals(xmlType.name()))        name = xmlType.name();      if (! "##default".equals(xmlType.namespace()))        namespace = xmlType.namespace();    }    if (name == null)      name = identifierToXmlName(cl);    QName qname = null;        if (namespace == null)      qname = new QName(name);    else      qname = new QName(namespace, name);    _datatypeMap.put(cl, qname);    return qname;  }  public static Class getClassForDatatype(QName qname)  {    return _classMap.get(qname);  }  public static String qNameToString(QName qName)  {    if (qName.getPrefix() == null || "".equals(qName.getPrefix()))      return qName.getLocalPart();    else      return qName.getPrefix() + ':' + qName.getLocalPart();  }  public static boolean isJAXBAnnotated(AnnotatedElement element)  {    return element.isAnnotationPresent(XmlAnyAttribute.class) ||           element.isAnnotationPresent(XmlAnyElement.class) ||           element.isAnnotationPresent(XmlAttribute.class) ||           element.isAnnotationPresent(XmlElement.class) ||           element.isAnnotationPresent(XmlElements.class) ||           element.isAnnotationPresent(XmlElementRef.class) ||           element.isAnnotationPresent(XmlID.class) ||           element.isAnnotationPresent(XmlValue.class);  }  static {    QName stringQName = new QName(XML_SCHEMA_NS, "string", XML_SCHEMA_PREFIX);    _datatypeMap.put(String.class, stringQName);    _classMap.put(stringQName, String.class);    QName bigDecimalQName =       new QName(XML_SCHEMA_NS, "decimal", XML_SCHEMA_PREFIX);    _datatypeMap.put(BigDecimal.class, bigDecimalQName);    _classMap.put(bigDecimalQName, BigDecimal.class);    QName bigIntegerQName =       new QName(XML_SCHEMA_NS, "integer", XML_SCHEMA_PREFIX);    _datatypeMap.put(BigInteger.class, bigIntegerQName);    _classMap.put(bigIntegerQName, BigInteger.class);    QName booleanQName = new QName(XML_SCHEMA_NS, "boolean", XML_SCHEMA_PREFIX);    _datatypeMap.put(Boolean.class, booleanQName);    _datatypeMap.put(boolean.class, booleanQName);    _classMap.put(booleanQName, boolean.class);    // XXX hexBinary    QName base64BinaryQName =       new QName(XML_SCHEMA_NS, "base64Binary", XML_SCHEMA_PREFIX);    _datatypeMap.put(Byte[].class, base64BinaryQName);     _datatypeMap.put(byte[].class, base64BinaryQName);    _classMap.put(base64BinaryQName, byte[].class);    QName byteQName = new QName(XML_SCHEMA_NS, "byte", XML_SCHEMA_PREFIX);    _datatypeMap.put(Byte.class, byteQName);    _datatypeMap.put(byte.class, byteQName);    _classMap.put(byteQName, byte.class);    QName charQName =       new QName(XML_SCHEMA_NS, "unsignedShort", XML_SCHEMA_PREFIX);    _datatypeMap.put(Character.class, charQName);    _datatypeMap.put(char.class, charQName);    _classMap.put(charQName, char.class);    // XXX time    QName calendarQName = new QName(XML_SCHEMA_NS, "date", XML_SCHEMA_PREFIX);    _datatypeMap.put(Calendar.class, calendarQName);    _classMap.put(calendarQName, Calendar.class);    QName dateTimeQName =       new QName(XML_SCHEMA_NS, "dateTime", XML_SCHEMA_PREFIX);    _datatypeMap.put(XMLGregorianCalendar.class, dateTimeQName);    _classMap.put(dateTimeQName, XMLGregorianCalendar.class);    QName doubleQName = new QName(XML_SCHEMA_NS, "double", XML_SCHEMA_PREFIX);    _datatypeMap.put(Double.class, doubleQName);    _datatypeMap.put(double.class, doubleQName);    _classMap.put(doubleQName, double.class);    QName floatQName = new QName(XML_SCHEMA_NS, "float", XML_SCHEMA_PREFIX);    _datatypeMap.put(Float.class, floatQName);     _datatypeMap.put(float.class, floatQName);    _classMap.put(floatQName, float.class);    QName intQName = new QName(XML_SCHEMA_NS, "int", XML_SCHEMA_PREFIX);    _datatypeMap.put(Integer.class, intQName);    _datatypeMap.put(int.class, intQName);    _classMap.put(intQName, int.class);    QName longQName = new QName(XML_SCHEMA_NS, "long", XML_SCHEMA_PREFIX);    _datatypeMap.put(Long.class, longQName);    _datatypeMap.put(long.class, longQName);    _classMap.put(longQName, long.class);    QName shortQName = new QName(XML_SCHEMA_NS, "short", XML_SCHEMA_PREFIX);    _datatypeMap.put(Short.class, shortQName);    _datatypeMap.put(short.class, shortQName);    _classMap.put(shortQName, short.class);  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?