protected Map<String,String> getProperties(final Object obj) {
		HashMap<String,String> map = new HashMap<String,String>();
		
		map.putAll(getMapProperties(obj));
		
		try {
			BeanInfo info = Introspector.getBeanInfo(obj.getClass());
			PropertyDescriptor[] pds = info.getPropertyDescriptors();
			
			if(pds!=null) {
				for(PropertyDescriptor pd : pds) {
					String name = pd.getName();
					
					if(!"class".equals(name)) {
						name = processName(name);
						
						String result = null;
						if(pd instanceof IndexedPropertyDescriptor) {
							// Ignore indexed methods.
						} else {
							if("data".equals(name) && isInstanceofMap(pd.getReadMethod().getReturnType())) {
								map.putAll(extractDataAttributes(pd, obj));
							} else {
								result = getResult(pd, obj);
							}
						}
						
						if(!StringUtils.isEmpty(result)) {
							map.put(name,result);
						}
					}
				}
			}
		} catch (IntrospectionException e) {
		}
		
		return map;
	}