All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.venky.swf.integration.FormatHelper Maven / Gradle / Ivy

The newest version!
package com.venky.swf.integration;

import java.io.InputStream;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.venky.core.collections.LowerCaseStringCache;
import com.venky.core.string.StringUtil;
import com.venky.core.util.ObjectUtil;
import com.venky.swf.db.annotations.column.ui.mimes.MimeType;
import com.venky.swf.db.model.io.ModelIOFactory.UnsupportedMimeTypeException;
import com.venky.swf.routing.Config;


public abstract class FormatHelper {
	protected FormatHelper(){
	
	}

	protected void fixInputCase(){
		KeyCase keyCase = KeyCase.valueOf(Config.instance().getProperty("swf.api.keys.case",KeyCase.CAMEL.toString()));

		if (keyCase != KeyCase.CAMEL){
			change_key_case(KeyCase.CAMEL);
		}
	}
	protected boolean isPlural(){
		return ObjectUtil.equals(StringUtil.pluralize(getRootName()), getRootName());
	}

	protected boolean isRootElementNameRequired(){
		return Config.instance().getBooleanProperty("swf.api.root.required",true);
	}
	protected void fixOutputCase(){
		if (!isRootElementNameRequired() && !isPlural() && getElementAttribute(getRootName()) != null) {
			T element = getElementAttribute(getRootName());
			setRoot(element);
		}
		KeyCase keyCase = KeyCase.valueOf(Config.instance().getProperty("swf.api.keys.case",KeyCase.CAMEL.toString()));

		if (keyCase != KeyCase.CAMEL){
			change_key_case(keyCase);
		}
	}

	private static Map> formatClassMap = new HashMap>();
	private static Map> formatBuilderMap = new HashMap>();
	
	public static  void registerFormat(MimeType mimeType, Class formatClass, FormatHelperBuilder formatBuilder){
		formatClassMap.put(mimeType, formatClass);
		formatBuilderMap.put(mimeType, formatBuilder);
	}
	
	@SuppressWarnings("unchecked")
	public static  Class getFormatClass(MimeType mimeType){
		Class formatClass = (Class) formatClassMap.get(mimeType);
		if (formatClass == null){
			throw new UnsupportedMimeTypeException(mimeType.toString());
		}
		return formatClass;
	}
	
	@SuppressWarnings("unchecked")
	public static  MimeType getMimeType(Class clazz){
		for (MimeType mime :formatClassMap.keySet()){
			Class formatClass = (Class) formatClassMap.get(mime);
			if (formatClass.isAssignableFrom(clazz)){
				return mime;
			}
		}
		throw new UnsupportedMimeTypeException(clazz.getName());
	}
	
	@SuppressWarnings("unchecked")
	public Class getFormatClass(){
		ParameterizedType pt = (ParameterizedType)this.getClass().getGenericSuperclass();
		return (Class) pt.getActualTypeArguments()[0];
	}
	
	public MimeType getMimeType(){
		return getMimeType(getFormatClass());
	}
	
	@SuppressWarnings("unchecked")
	public static final  FormatHelper instance(MimeType mimeType,String rootName,boolean isPlural){
		FormatHelper helper = null;
		FormatHelperBuilder formatHelperBuilder = (FormatHelperBuilder) formatBuilderMap.get(mimeType);
		if (formatHelperBuilder != null){
			helper = formatHelperBuilder.constructFormatHelper(rootName, isPlural);
		}
		if (helper == null){
			throw new UnsupportedMimeTypeException(mimeType.toString());
		}
		return helper;
	}

	public static final   FormatHelper instance(T element){
		return instance(getMimeType(element.getClass()),element);
	}
	@SuppressWarnings("unchecked")
	public static final  FormatHelper instance(MimeType mimeType, InputStream in){
		FormatHelper helper = null;
		FormatHelperBuilder formatHelperBuilder = (FormatHelperBuilder) formatBuilderMap.get(mimeType);
		if (formatHelperBuilder != null){
			helper = formatHelperBuilder.constructFormatHelper(in);
		}
		if (helper == null){
			throw new UnsupportedMimeTypeException(mimeType.toString());
		}
		return helper;
	}
	@SuppressWarnings("unchecked")
	public static final  FormatHelper instance(MimeType mimeType,T element){
		FormatHelper helper = null;
		FormatHelperBuilder formatHelperBuilder = (FormatHelperBuilder) formatBuilderMap.get(mimeType);
		if (formatHelperBuilder != null){
			helper = formatHelperBuilder.constructFormatHelper(element);
		}
		if (helper == null){
			throw new UnsupportedMimeTypeException(mimeType.toString());
		}
		return (FormatHelper) helper;
	}

	public abstract void setRoot(T root);
	public abstract T getRoot();
	public abstract String getRootName();
	public abstract T changeRootName(String toName);

	public abstract T createArrayElement(String name);
	public abstract List getArrayElements(String name) ;
	public abstract Set getArrayElementNames();
	public abstract void removeArrayElement(String name);
	public abstract void setArrayElement(String name, List elements);

	public abstract T createElementAttribute(String name);
	public abstract T getElementAttribute(String name);
	public abstract Set getElementAttributeNames();

	public abstract void setAttribute(String name,T element);
	public abstract void removeElementAttribute(String name);


	public abstract void setAttribute(String name, String value);
	public abstract void setElementAttribute(String name, String value);

	public abstract Set getAttributes();
	public abstract 

P getAttribute(String name); public abstract boolean hasAttribute(String name); public boolean isArrayAttribute(String name){ return false; } public void setAttribute(String name, String[] value) { throw new UnsupportedOperationException("Array attribute not supported for " + getMimeType()); } public abstract void removeAttribute(String name) ; public enum KeyCase { SNAKE, CAMEL, } public T change_key_case(KeyCase toKeyCase){ FormatHelper helper = this; for (String name : helper.getAttributes()){ if (toKeyCase == KeyCase.CAMEL && !Character.isUpperCase(name.charAt(0)) || toKeyCase == KeyCase.SNAKE && Character.isUpperCase(name.charAt(0))){ boolean isArray = isArrayAttribute(name); Object v = getAttribute(name) ; String newName = toKeyCase == KeyCase.CAMEL ? StringUtil.camelize(name) : LowerCaseStringCache.instance().get(StringUtil.underscorize(name)); if (isArray) { helper.setAttribute(newName, (String[])v); }else { helper.setAttribute(newName,(String)v); } helper.removeAttribute(name); }else { break; } } for (String name : helper.getArrayElementNames()) { if (toKeyCase == KeyCase.CAMEL && !Character.isUpperCase(name.charAt(0)) || toKeyCase == KeyCase.SNAKE && Character.isUpperCase(name.charAt(0))){ List childElements = helper.getArrayElements(name); List newChildElements = new ArrayList<>(); for (T childElement : childElements){ newChildElements.add(FormatHelper.instance(childElement).change_key_case(toKeyCase)); } String newName = toKeyCase == KeyCase.CAMEL ? StringUtil.camelize(name) : LowerCaseStringCache.instance().get(StringUtil.underscorize(name)); String rootName = getRootName(); if (rootName != null && rootName.equals(StringUtil.pluralize(name))){ helper.setArrayElement(name, newChildElements); }else { helper.setArrayElement(newName, newChildElements); helper.removeArrayElement(name); } }else { break; } } for (String name : helper.getElementAttributeNames()) { if (toKeyCase == KeyCase.CAMEL && !Character.isUpperCase(name.charAt(0)) || toKeyCase == KeyCase.SNAKE && Character.isUpperCase(name.charAt(0))){ FormatHelper.instance(helper.getElementAttribute(name)).change_key_case(toKeyCase); String newName = toKeyCase == KeyCase.CAMEL ? StringUtil.camelize(name) : LowerCaseStringCache.instance().get(StringUtil.underscorize(name)); helper.setAttribute(newName,helper.getElementAttribute(name)); helper.removeElementAttribute(name); }else { break; } } String name = getRootName(); if (name != null && (toKeyCase == KeyCase.CAMEL && !Character.isUpperCase(name.charAt(0)) || toKeyCase == KeyCase.SNAKE && Character.isUpperCase(name.charAt(0)))){ String newName = toKeyCase == KeyCase.CAMEL ? StringUtil.camelize(name) : LowerCaseStringCache.instance().get(StringUtil.underscorize(name)); helper.changeRootName(newName); } return helper.getRoot(); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy