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

com.ibm.as400.access.AS400JDBCConnectionForcedCcsid Maven / Gradle / Ivy

The newest version!
package com.ibm.as400.access;

import java.lang.StackWalker.StackFrame;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class AS400JDBCConnectionForcedCcsid extends AS400JDBCConnectionImpl {
	private static Logger log = Logger.getLogger(AS400JDBCConnectionForcedCcsid.class.toString());

	public static final String FROM_CCSID = "from.ccsid";
	public static final String TO_CCSID = "to.ccsid";
	private Integer fromCcsid;
	private Integer toCcsid;

	public AS400JDBCConnectionForcedCcsid() {
		super();
	}

	@Override
	public ConvTable getConverter(int ccsid) throws SQLException {
		if (this.fromCcsid != null && fromCcsid.intValue() == ccsid && toCcsid != null) {
			log.fine(() -> String.format("requested ccsid %d using replacement ccsid %d\n\t%s", ccsid, toCcsid,
					getStack()));
			return super.getConverter(this.toCcsid);
		}
		log.fine(() -> String.format("requested ccsid %d using parent converter\n\t%s", ccsid, getStack()));
		return super.getConverter(ccsid);
	}

	@Override
	public void setProperties(JDDataSourceURL dataSourceUrl, JDProperties properties, AS400 as400, Properties info)
			throws SQLException {
		super.setProperties(dataSourceUrl, properties, as400, info);
		fromCcsid = getInteger(properties, info, FROM_CCSID);
		toCcsid = getInteger(properties, info, TO_CCSID);
	}
	
	public Integer getInteger(JDProperties urlProperties, Properties info, String key) {
		final int index = JDProperties.getPropertyIndex(key);
		if (index > -1) {
			return urlProperties.getInt(index);
		}
		final String jv = info.getProperty(key);
		if (jv != null) {
			return Integer.parseInt(jv);
		}
		return null;
	}

	public List toString(Stream stackFrameStream) {

		return stackFrameStream
				.map(f -> String.format("%s.%s#%d", f.getClassName(), f.getMethodName(), f.getLineNumber()))
				.collect(Collectors.toList());
	}

	private String getStack() {
		final List stackTrace = StackWalker.getInstance().walk(this::toString);
		return String.join("\n\t", stackTrace);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy