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

es.molabs.jdbc.language.db.DbMultilanguage Maven / Gradle / Ivy

/**
 * Copyright (C) 2016 Luis Moral Guerrero 
 *
 * Licensed 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 es.molabs.jdbc.language.db;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;

import es.molabs.jdbc.DbQuery;
import es.molabs.jdbc.exception.DbException;
import es.molabs.jdbc.language.DbLanguageManager;
import es.molabs.jdbc.language.LocaleValue;
import es.molabs.jdbc.language.LocalizedKey;
import es.molabs.jdbc.language.db.dao.GetKeyRowMapper;
import es.molabs.jdbc.mapper.ClobRowMapper;

public class DbMultilanguage 
{
	private DbLanguageManager languageManager = null;
	
	public DbMultilanguage(DbLanguageManager languageManager)
	{
		this.languageManager = languageManager;
	}
	
	public String getKey(String key, String field, DbQuery dbQuery) throws DbException
	{		
		return dbQuery.getObject(ClobRowMapper.getInstance(), "SELECT " + field + " FROM " + languageManager.getTableName() + " WHERE " + languageManager.getKeyName() + " = ?", key);
	}
	
	public List getKey(String key, DbQuery dbQuery)
	{
		String fields = StringUtils.join(languageManager.getLocaleSet().iterator(), ", ");
				
		return toLocaleValueList(languageManager.getLocaleSet(), dbQuery.getObject(GetKeyRowMapper.getInstance(), "SELECT " + fields + " FROM " + languageManager.getTableName() + " WHERE " + languageManager.getKeyName() + " = ?", key));
	}
	
	public int insertKey(DbQuery dbQuery, LocalizedKey...localizedKeys)
	{
		// Checks that localizedKeys is not null or empty
		if (localizedKeys == null || localizedKeys.length == 0) throw new IllegalArgumentException("LocalizedKeys parameter cannot be null or empty.");
		
		StringBuffer sql = null;
		
		// For each LocalizedKey
		for (int k=0; k fieldValueMap = new HashMap();		
		
		StringBuilder sql = null;
		StringBuilder keyBuilder = new StringBuilder();		
				
		// For each LocalizedKey
		for (int k=0; k iterator = fieldValueMap.keySet().iterator();
		
		// For each value in the map adds it to the sql
		while (iterator.hasNext())
		{
			String field = iterator.next();
			
			if (!first) sql.append(", ");
		
			sql.append(field);		
			sql.append(" = (CASE" + fieldValueMap.get(field).toString() + " END)");
			
			if (!first) sql.append(" ");
			
			first = false;
		}
		
		sql.append("WHERE " + languageManager.getKeyName() + " IN (" + keyBuilder.toString() + ")");
				
		return dbQuery.executeUpdate(sql.toString(), toUpdateValues(localizedKeys));
	}
	
	public int deleteKey(String key, DbQuery dbQuery)
	{		
		return dbQuery.executeUpdate("DELETE FROM " + languageManager.getTableName() + " WHERE " + languageManager.getKeyName() + " = ?", key);		
	}
	
	public int duplicateKey(String sourceKey, String destinationKey, DbQuery dbQuery)
	{
		String fields = StringUtils.join(languageManager.getLocaleSet().iterator(), ", ");
		
		return dbQuery.executeUpdate("INSERT INTO " + languageManager.getTableName() + " (SELECT '" + StringEscapeUtils.escapeJava(destinationKey) + "', " + fields + " FROM " + languageManager.getTableName() + " WHERE " + languageManager.getKeyName() + " = ?)", sourceKey);
	}
	
	public StringBuilder export(String key, StringBuilder sql, DbQuery dbQuery)
	{		
		// Fields to insert
		String fields = StringUtils.join(languageManager.getLocaleSet().iterator(), ", ");
				
		sql.append("INSERT INTO " + languageManager.getTableName() + " (" + languageManager.getKeyName() + ", " + fields + ") VALUES ('" + key + "'");
				
		// For each locale
		Iterator iterator = languageManager.getLocaleSet().iterator();
		while (iterator.hasNext())
		{
			Locale locale = iterator.next();
		
			sql.append(", '");			
			sql.append(getKey(key, languageManager.getField(locale), dbQuery));
			sql.append("'");
		}
		
		sql.append(");");
		
		return sql;
	}
	
	private Object[] toInsertValues(LocalizedKey...localizedKeys)
	{
		List valueList = new LinkedList();
		
		// For each LocalizedKey
		for (int k=0; k toLocaleValueList(Set localeSet, List valueList)
	{
		if (localeSet == null || valueList == null) return null;
		
		List localeValueList = new ArrayList(valueList.size());
		
		Iterator valueIterator = valueList.iterator();
		Iterator localeIterator = localeSet.iterator();
		
		while (valueIterator.hasNext() && localeIterator.hasNext())
		{
			localeValueList.add(new LocaleValue(localeIterator.next(), valueIterator.next()));
		}
		
		return localeValueList;
	}
}