blob: 8d1695cde5d097054e1227a1b6eaf18c931b1bc7 [file] [log] [blame]
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~ 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.sling.contentparser.xml.jcr.internal;
import java.lang.reflect.Array;
import java.math.BigDecimal;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Calendar;
import java.util.UUID;
import javax.jcr.PropertyType;
import org.apache.jackrabbit.util.ISO8601;
import org.apache.jackrabbit.vault.util.DocViewProperty;
/**
* Parses JCR XML files that contains content fragments.
*/
class JcrXmlValueConverter {
private JcrXmlValueConverter() {
// static methods only
}
/**
* Parse value from XML Attribute.
*
* @param value XML attribute value
* @return value object
*/
static Object parseValue(final String name, final String value) {
if (value == null) {
return null;
}
DocViewProperty prop = DocViewProperty.parse(name, value);
// convert values
if (prop.isMulti) {
Class<?> arrayType = getType(prop.type);
if (arrayType == null) {
return null;
}
Object result = Array.newInstance(arrayType, prop.values.length);
for (int i = 0; i < prop.values.length; i++) {
Array.set(result, i, convertValue(prop.values[i], prop.type));
}
return result;
} else {
return convertValue(prop.values[0], prop.type);
}
}
/**
* Parse value depending on type prefix.
*
* @param value Value
* @param type Type
* @return Value object
*/
private static Object convertValue(final String value, final int type) {
switch (type) {
case PropertyType.UNDEFINED:
case PropertyType.STRING:
case PropertyType.NAME:
case PropertyType.PATH:
return value;
case PropertyType.BOOLEAN:
return Boolean.valueOf(value);
case PropertyType.LONG:
return Long.valueOf(value);
case PropertyType.DOUBLE:
return Double.valueOf(value);
case PropertyType.DECIMAL:
return new BigDecimal(value);
case PropertyType.DATE:
return ISO8601.parse(value);
case PropertyType.REFERENCE:
case PropertyType.WEAKREFERENCE:
return UUID.fromString(value);
case PropertyType.URI:
try {
return new URI(value);
} catch (URISyntaxException ex) {
throw new IllegalArgumentException("Unexpected URI syntax: " + value);
}
case PropertyType.BINARY:
// not supported - ignore value
return null;
default:
throw new IllegalArgumentException("Unexpected type: " + PropertyType.nameFromValue(type));
}
}
/**
* Get java type for given JCR type.
*
* @param type Type
* @return Type
*/
private static Class<?> getType(final int type) {
switch (type) {
case PropertyType.UNDEFINED:
case PropertyType.STRING:
case PropertyType.NAME:
case PropertyType.PATH:
return String.class;
case PropertyType.BOOLEAN:
return Boolean.class;
case PropertyType.LONG:
return Long.class;
case PropertyType.DOUBLE:
return Double.class;
case PropertyType.DECIMAL:
return BigDecimal.class;
case PropertyType.DATE:
return Calendar.class;
case PropertyType.REFERENCE:
case PropertyType.WEAKREFERENCE:
return UUID.class;
case PropertyType.URI:
return URI.class;
case PropertyType.BINARY:
// not supported - ignore value
return null;
default:
throw new IllegalArgumentException("Unexpected type: " + PropertyType.nameFromValue(type));
}
}
}