blob: db8bc988ef3a819763e3019545621116267df46b [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.felix.ipojo.parser;
import org.apache.felix.ipojo.metadata.Element;
/**
* A Field Metadata represents a field of the implementation class.
* This class avoids using reflection to get the type and the name of a field.
*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class FieldMetadata {
/**
* The name of the field.
*/
private String m_name;
/**
* The yype of the field.
*/
private String m_type;
/**
* Creates a field metadata.
* This constructor is used when creating the {@link PojoMetadata}
* object.
* @param metadata the field manipulation element from Manipulation
* Metadata.
*/
FieldMetadata(Element metadata) {
m_name = metadata.getAttribute("name");
m_type = metadata.getAttribute("type");
}
/**
* Creates a field metadata.
* This constructor can be used to avoid using {@link PojoMetadata}.
* Be care that creating such {@link FieldMetadata} does not assert its
* presence in the implementation class.
* @param field the field name.
* @param type the type of the field.
*/
public FieldMetadata(String field, String type) {
m_name = field;
m_type = type;
}
public String getFieldName() { return m_name; }
public String getFieldType() { return m_type; }
/**
* Gets the 'reflective' type of the given type.
* The reflective type is the type used by the Java Reflection API.
* More precisely this method handles the array cases
* @param type the type to analyze to find the Java reflective type.
* @return the reflective type corresponding to this field.
*/
public static String getReflectionType(String type) {
// Primitive Array
if (type.endsWith("[]") && type.indexOf('.') == -1) {
int index = type.indexOf('[');
return '[' + getInternalPrimitiveType(type.substring(0, index));
}
// Non-Primitive Array
if (type.endsWith("[]") && type.indexOf('.') != -1) {
int index = type.indexOf('[');
return "[L" + type.substring(0, index) + ";";
}
// The type is not an array.
return type;
}
/**
* Gets the internal notation for primitive type.
* @param string the String form of the type
* @return the internal notation or <code>null</code> if not found
*/
public static String getInternalPrimitiveType(String string) {
if (string.equalsIgnoreCase("boolean")) {
return "Z";
}
if (string.equalsIgnoreCase("char")) {
return "C";
}
if (string.equalsIgnoreCase("byte")) {
return "B";
}
if (string.equalsIgnoreCase("short")) {
return "S";
}
if (string.equalsIgnoreCase("int")) {
return "I";
}
if (string.equalsIgnoreCase("float")) {
return "F";
}
if (string.equalsIgnoreCase("long")) {
return "J";
}
if (string.equalsIgnoreCase("double")) {
return "D";
}
return null;
}
/**
* Gets the iPOJO primitive type from the given primitive class.
* @param clazz the class of the primitive type
* @return the iPOJO primitive type name or <code>null</code> if
* not found.
*/
public static String getPrimitiveTypeByClass(Class clazz) {
if (clazz.equals(Boolean.TYPE)) {
return "boolean";
}
if (clazz.equals(Character.TYPE)) {
return "char";
}
if (clazz.equals(Byte.TYPE)) {
return "byte";
}
if (clazz.equals(Short.TYPE)) {
return "short";
}
if (clazz.equals(Integer.TYPE)) {
return "int";
}
if (clazz.equals(Float.TYPE)) {
return "float";
}
if (clazz.equals(Long.TYPE)) {
return "long";
}
if (clazz.equals(Double.TYPE)) {
return "double";
}
return null;
}
}