Escolar Documentos
Profissional Documentos
Cultura Documentos
Obs: las librerías JRE System Library son propias del JRE 1.8.0_221
Aplicativofix
1 Carpeta Conf.:
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=logs/cjfix.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ISO8601}
%5p %c{1}:%L - %m%n
log4j.appender.file.MaxBackupIndex=5 Índice máximo de backup
para archivos
log4j.appender.file.Append=true Activado el valor para
agregar en el archivo log4j
log4j.appender.file.ImmediateFlush=true
log4j.appender.file.MaxFileSize=1024KB Máxima capacidad de
memoria para el archive a
generarse
log4j.logger.net.sf.hibernate=info
log4j.logger.org.hibernate=info
log4j.logger.org.hibernate.type=info
log4j.logger.org.hibernate.ps.PreparedStatementCache=info
this.cityCode = cityCode;
}
public String getBranch() {
return branch;
Método get y set de la variable Branch
}
.getCodeSource().getLocation().getPath());
String runningPath =
f.getParent();
log.debug("Running in: " +
runningPath);
File propFile = new
File("conf/market.properties");
log.debug("Reading file from:
" + propFile.getAbsoluteFile());
FileInputStream fis = new
FileInputStream(
propFile.getAbsoluteFile());
defaultProperties.load(fis);
fis.close();
marketTypes.put(next, t);
}
}
}
log.info("Market types
loaded");
} catch (Exception e) {
log.error("Error", e);
}
}
transactionOrders.values());
// TODO sort list
// Collections.sort(list);
return list;
}
public void updateStatisticsData(StatisticData Metodo que recibe una estructura de tipo
data) {
dato e inserta en la estructura el valor de la
statistics.put(data.getKey(), llave y el dato
data);
}
public StatisticData Metodo que recibe una estructura de tipo
removeStatisticsData(StatisticData data) {
dato y remueve en la estructura el valor de la
return llave y el dato
statistics.remove(data.getKey());
}
public void updateOrder(Order order) { Metodo que recibe una estructura de tipo
orden y permite poner una llave y una orden
if (order.getSide() ==
Order.Side.OFFER) {
offers.put(order.getKey(),
order);
} else if (order.getSide() ==
Order.Side.BID) {
bids.put(order.getKey(),
order);
}
}
public Order removeOrder(Order order) { Metodo que recibe una estructura de tipo
orden y permite remover por medio de una
if (order.getSide() ==
Order.Side.OFFER) { llave
return
offers.remove(order.getKey());
} else if (order.getSide() ==
Order.Side.BID) {
return
bids.remove(order.getKey());
}
return null;
}
tmpKey.append(KEY_FORMAT.format(endDate));
}
key = tmpKey.toString();
}
return key;
}
TagMap.java: Clase java TagMap donde se crea el método put, recibe una
estructura de tipo Tag.
public class TagMap extends TreeMap<Integer, Se define un método que recibe como
Tag> {
parámetro getnumber y una estructura de
public void put(Tag tag) {
put(tag.getNumber(), tag); tipo Tag con campos :
} number
} fieldName
required
valueFormat
this.dateTime = dateTime;
}
public String getOrderCode() { Método que recibe el get y set del código de
orden
return orderCode;
}
this.orderCode = orderCode;
}
public Market getMarket() { Método que recibe el get y set del mercado
return market;
}
this.market = market;
}
public Order.Side getSide() { Método que recibe el get y set del side
return side;
}
this.side = side;
}
public int getValueDate() { Método que recibe el get y set del valor de
la fecha
return valueDate;
}
this.valueDate = valueDate;
}
public Date getDeliveryDate() { Método que recibe el get y set de la fecha
de entrega
return deliveryDate;
}
this.deliveryDate = deliveryDate;
}
public int getDays() { Método que recibe el get y set de los días
return days;
}
this.days = days;
}
public Order.Compensation getCompensation() { Método que recibe el get y set de
compensación
return compensation;
}
public void
setCompensation(Order.Compensation compensation) {
this.compensation = compensation;
}
public String getBondIdentifier() { Método que recibe el get y set del
identificador de bond
return bondIdentifier;
}
this.bondIdentifier = bondIdentifier;
}
public double getPrice() { Método que recibe el get y set del precio
return price;
}
this.price = price;
}
public int getTradedNumber() { Método que recibe el get y set del mercado
return tradedNumber;
}
this.tradedNumber = tradedNumber;
}
public String getTitleCode() { Método que recibe el get y set del título del
codigo
return titleCode;
}
this.titleCode = titleCode;
}
public String getEmitter() { Método que recibe el get y set del emisor
return emitter;
}
this.emitter = emitter;
}
public String getCountryCode() { Método que recibe el get y set del código
del país
return countryCode;
}
this.countryCode = countryCode;
}
public String getEmitterCode() { Método que recibe el get y set del código
del país
return emitterCode;
}
this.emitterCode = emitterCode;
}
public Order.IssueType getIssueType() { Método que recibe el get y set del
Tipo de problema
return issueType;
}
this.issueType = issueType;
}
public String getCurrency() { Método que recibe el get y set de la
moneda
return currency;
}
this.currency = currency;
}
public double getInterestRate() { Método que recibe el get y set del ratio de
interés
return interestRate;
}
this.interestRate = interestRate;
}
public Date getEmissionDate() { Método que recibe el get y set del fecha de
emisión
return emissionDate;
}
this.emissionDate = emissionDate;
}
public Date getMaturityDate() { Método que recibe el get y set del fecha de
vencimiento
return maturityDate;
}
this.maturityDate = maturityDate;
}
public double getSpotPrice() { Método que recibe el get y set del precio al
contado
return spotPrice;
}
this.spotPrice = spotPrice;
}
public double getFinalPrice() { Método que recibe el get y set del precio
final
return finalPrice;
}
this.finalPrice = finalPrice;
}
public double getYieldRate() { Método que recibe el get y set de la tasa de
rendimiento
return yieldRate;
}
this.yieldRate = yieldRate;
}
public double getEffectiveMontlhyYieldRate() Método que recibe el get y set de la tasa de
{
rendimiento del mes efectivo
return effectiveMontlhyYieldRate;
}
public void
setEffectiveMontlhyYieldRate(double
effectiveMontlhyYieldRate) {
this.effectiveMontlhyYieldRate =
effectiveMontlhyYieldRate;
}
public String getOrderCode1() { Método que recibe el get y set del código de
orden
return orderCode1;
}
this.orderCode1 = orderCode1;
}
public String getTitleName() { Método que recibe el get y set nombre del
titulo
return titleName;
}
this.titleName = titleName;
}
public String getTitleIdentifier() { Método que recibe el get y set del
identificador de titulo
return titleIdentifier;
}
this.titleIdentifier =
titleIdentifier;
}
public String getTitleAlternateIdentifier() Método que recibe el get y set del
{
identificador del título alterno
return titleAlternateIdentifier;
}
public void
setTitleAlternateIdentifier(String
titleAlternateIdentifier) {
this.titleAlternateIdentifier =
titleAlternateIdentifier;
}
public String getEmitterName() { Método que recibe el get y set del código
del emisor
return emitterName;
}
this.emitterName = emitterName;
}
Método que recibe el get y set del nombre
public String getEmitterShortName() {
corto del emisor
return emitterShortName;
}
public void setEmitterShortName(String
emitterShortName) {
this.emitterShortName =
emitterShortName;
}
public long getOperationTicks() { Método que recibe el get y set del
operación ticks
return operationTicks;
}
this.operationTicks = operationTicks;
}
public RegisterFlag getRegisterFlag() { Método que recibe el get y set del flag del
registro
return registerFlag;
}
this.registerFlag = registerFlag;
}
public Date getRegisterHour() { Método que recibe el get y set del registro
de horas
return registerHour;
}
this.registerHour = registerHour;
}
public Origin getOrigin() { Método que recibe el get y set del origen
return origin;
}
this.origin = origin;
}
public void setMessage(Message message) { Método que recibe el get y set del mensaje
this.message = message;
@Override
public Message getMessage() {
return message;
}
public int compareTo(StatisticData arg0) { Método que recibe un argumento y valida
el número de días.
int c = this.days - arg0.days;
if (c == 0) {
c =
this.dateTime.compareTo(arg0.dateTime);
}
return c;
}
public int hashCode() { Metodo que realiza cálculos de operación y
que permite obtener un resultado de tipo
final int prime = 31;
int result = 1; entero
result = prime * result
+ ((orderCode == null) ?
0 : orderCode.hashCode());
result = prime * result
+ ((dateTime == null) ?
0 : dateTime.hashCode());
result = prime * result + ((market ==
null) ? 0 : market.hashCode());
result = prime * result + ((side ==
null) ? 0 : side.hashCode());
result = prime * result +
tradedNumber;
result = (int) (prime * result +
price);
return result;
}
public boolean equals(Object obj) { Método que devuelve un valor lógico el cual
valida el objeto obtenido como argumento
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof StatisticData))
{
return false;
}
StatisticData other = (StatisticData)
obj;
if (orderCode == null) {
if (other.orderCode != null) {
return false;
}
} else if
(!orderCode.equals(other.orderCode)) {
return false;
}
if (dateTime == null) {
if (other.dateTime != null) {
return false;
}
} else if
(!dateTime.equals(other.dateTime)) {
return false;
}
if (market == null) {
if (other.market != null) {
return false;
}
} else if
(!market.equals(other.market)) {
return false;
}
if (side != other.side) {
return false;
}
if (tradedNumber !=
other.tradedNumber) {
return false;
}
if (price != other.price) {
return false;
}
return true;
}
public String getKey() { Método que permite formatear los valor de
fechas y horas
return market.getCode()
+
DatatecFields.DATATEC_DATE_FORMAT.format(dateTime)
+
DatatecFields.DATATEC_TIME_FORMAT.format(dateTime)
+ orderCode +
orderCode1;
}
Order.java.: Clase java Order donde se crea los método get y set de las
variables declaradas en la clase, así mismo se crea un enumerado que
almacena valores constantes y métodos para realizar operaciones.
protected double price; Variable para almacenar el valor del
precio
protected double amount; Variable para almacenar el valor del
monto
protected double totalAmount; Variable para almacenar el valor del
total del monto
protected Side side; Variable para almacenar el valor del
lado
protected String code; Variable para almacenar el valor del
código
protected Market market; Variable para almacenar el valor del
mercado
protected String institutionCode; Variable para almacenar el valor del
código de institución
private int goodFor; Variable para almacenar el valor del
goodfor
private Date maturityDate; Variable para almacenar el valor de la
fecha de madurez
private int days; Variable para almacenar el valor de
días
private Message message; Variable para almacenar el valor de
mensajes
private int valueDateCDBCR; Variable para almacenar el valor de las
fechas CDBCR
private double yieldCDBCR; Variable para almacenar el valor del
rendimiento de CDBCR
private double pricePercentageFI; Variable para almacenar el valor del
precio del porcentaje FI
public static final NumberFormat RATE_FORMAT = new Variable para almacenar el valor del
DecimalFormat("0.000"); RATE_FORMAT
public enum Side { Se declara un tipo enum para
BID('D'),
almacenar datos de tipo
OFFER('O');
BID,OFFTER,code,side
private char code;
this.code = code;
}
return code;
}
public enum Compensation { Se declara un tipo enum para
almacenar datos de tipo PHYSICAL,
PHYSICAL('F'),
NON_DELIVERY('N'), NON_DELIVERY, REFERENCE,
REFERENCE('R'), INDICATIVE, WITHDRAL
INDICATIVE('I'),
DEFERRED_WITHDRAL('D');
this.code = code;
}
return code;
}
}
public enum IssueType { Se declara un tipo enum para
almacenar datos.
WITHOUT_INTERESTS_OR_SINGLE_INTEREST_PAYMENT(1),
SEVERAL_PAYMENTS_OF_INTEREST_OR_CAPITAL(2),
WITHOUT_INTERESTS_OR_MATURITY_DATE(3);
this.code = code;
}
return code;
}
}
public Order(Market, Side, String code, double Método order que declara variables
rate,
para obtener campos
double amount, double totalAmount)
{
this.market = market;
this.side = side;
this.code = code;
this.price = rate;
this.amount = amount;
this.totalAmount = totalAmount;
}
public int compareTo(Order o) { Método que recibe un objeto de tipo
int c = 0;
order y permite comparar los valor de
if (side == Side.BID && o.side == Side.BID) {
if (price != o.price) { BID y OFFER
c = price > o.price ? -1 : 1;
}
}
if (side == Side.OFFER && o.side == Side.OFFER)
{
if (price != o.price) {
c = price < o.price ? -1 : 1;
}
}
return c;
}
public double getPrice() { Método get y set que se genera para
el precio
return price;
}
this.price = price;
}
this.amount = amount;
}
public Side getSide() { Método get y set que se genera para
el lado
return side;
}
public void setSide(Side side) {
this.side = side;
}
this.code = code;
}
this.totalAmount = totalAmount;
}
this.goodFor = goodFor;
}
public Message getMessage() { Método get y set que se genera para
los mensajes
return message;
}
this.message = message;
}
public String getKey() { Método get y set que se genera para
los obtener los valores del mercado y
return getMarket().getCode() + code;
} del código
public String getInstitutionCode() { Método get y set que se genera para
los obtener los valores del código de la
return institutionCode;
} instutcion
this.institutionCode = institutionCode;
}
public Date getMaturityDate() { Método get y set que se genera para
los obtener los valores de la fecha de
return maturityDate;
} madurez
this.maturityDate = maturityDate;
}
public int getDays() { Método get y set que se genera para
los obtener los valores del dia
return days;
}
this.days = days;
}
public int getValueDateCDBCR() { Método get y set que se genera para
los obtener los valores de fecha
return valueDateCDBCR;
} CDBCR
this.valueDateCDBCR = valueDateCDBCR;
}
public double getYieldCDBCR() { Método get y set que se genera para
los obtener los valores de rendimiento
return yieldCDBCR;
} CDBCR
this.yieldCDBCR = yieldCDBCR;
}
this.pricePercentageFI =
pricePercentageFI;
}
3 com.datatec.fix
ClientSession.java: Clase java ClientSession donde se define variable
privadas, variables estáticas finales con valores constantes , métodos de
conexión, recibir datos atraves de la comunicación con el cliente.
protected static Logger log = Se declara variables log de tipo
Logger.getLogger(ClientSession.class
registro
.getName());
private final static int READ_BUFFER_LEN = 1024 * 2; Declaración de variables estáticas
public final static int TIMEOUT = 60;
finales con valores constantes
public final static int TIMEOUT_MILLIS = TIMEOUT * 1000;
private final static int TIMEOUT_DELTA = TIMEOUT_MILLIS /
10;
private String server; Se delcaran variables privadas para
private int port;
el manejo de datos los valores de las
private OutputStream output;
private InputStream input; transaciones y comunicación con el
private Socket connection; aplicativo cliente
private ReceptionThread;
private String language;
private boolean connected;
private boolean loggedIn;
private long seqNum;
protected long messageId;
protected Map<String, Market> markets; Se declaran interfaz tipo map , listas
protected List<MessageListener> listeners;
y entidades de tipo DatatecFields
protected DatatecFields;
public void run() { Metodo que permite realizar una
comunicación con el aplicativo
StringBuffer strTag = new
StringBuffer(); cliente, recibe datos de la
Message msg = new Message(null); transacción y los valida con los
byte[] tmp; valores almacenados en los tag y de
Date timeLastMessage = new Date();
las variables estáticas finales.
try {
while (connected) {
if
(connection.isClosed()) {
+ strTag.toString());
Tag = Tag.fromString(strTag.toString());
msg.addTag(tag);
if (tag.getNumber() == Tag.CHECK_SUM) {
receiveMessage(msg);
// Notifiy listeners
for (MessageListener ml :
listeners) {
ml.processConnectionClosed();
}
}
} catch (Exception e) {
log.error(e);
}
}
private void receiveMessage(Message msg) { Metodo que permite recibir una
estructura de tipo mensaje, procesa
String msgType =
msg.getTag(Tag.MSG_TYPE).getValue().toString(); los mensaje de protocolo fijo,
int receivedLen = mensaje del proceso de logeo, los
Integer.parseInt(msg.getTag(Tag.BODY_LENGTH) mensaje de información financiera
.getValue().toString());
y notificaciones.
int receivedCheckSum =
Integer.parseInt(msg.getTag(Tag.CHECK_SUM)
.getValue().toString());
int receivedSeqNumber =
Integer.parseInt(msg.getTag(Tag.MSG_SEQ_NUM)
.getValue().toString());
msg.assemble();
if (seqNum <= receivedSeqNumber) {
seqNum = receivedSeqNumber + 1;
}
log.debug("Message:\n" + msg.toString());
try {
// Process message
receivePricesAmountsTradedData(msg);
}else if
(Message.MSG_TYPE_TRANSACTION_ORDER.equals(msgType)) {
receiveTransactionOrderData(msg);
}
} catch (Exception e) {
log.error("Error - ", e);
}
}
protected Market receiveMarketData(Message msg) { Metodo que permite obtener los
datos del mercado, copia de
Market mkt = new Market();
Tag = msg.getTag(27000); pedidos y estadísticas a un nuevo
mkt.setCode(tag != null ? mercado
tag.getValue().toString() : null);
mkt.setGroup(msg.getTag(27010).getValue().toString
());
mkt.setFullName(msg.getTag(27860).getValue().toStr
ing());
mkt.setShortName(msg.getTag(27870).getValue().toSt
ring());
int access =
Integer.parseInt(msg.getTag(27890).getValue().toString())
;
if (access == 0) {
mkt.setAccess(Market.Access.FORBIDDEN);
} else if (access == 1) {
mkt.setAccess(Market.Access.VIEW_ONLY);
} else if (access == 2) {
mkt.setAccess(Market.Access.OPERATE);
}
if (Market.marketTypes.get(mkt.getCode()) !=
null) {
mkt.setType(Market.marketTypes.get(mkt.getCode()))
;
} else {
mkt.setType(Market.Type.UNDEFINED);
}
mkt.setMessage(msg);
mkt.setStatistics(existing.getStatistics());
mkt.setBids(existing.getBids());
mkt.setOffers(existing.getOffers());
}
markets.put(mkt.getCode(), mkt);
return mkt;
}
close();
}
public void open() throws Exception { Método que permite abrir una
comunicación con el cliente y deja
log.info("Starting FIX session at " + server
+ ":" + port); en espera de la recepción de datos
connection = new Socket(server, port);
input = new
BufferedInputStream(connection.getInputStream());
output = new
DataOutputStream(connection.getOutputStream());
seqNum = 0;
messageId = 0;
connected = connection.isConnected();
log.info("Starting receiving thread");
receptionThread.start();
}
public void close() throws Exception { Método que permite cerrar el canal
de comunicación con el cliente
sendDatatecLogoffMessage();
markets = new LinkedHashMap<String,
Market>();
connected = false;
seqNum = 0;
}
protected void sendMessage(Message message) throws Método que envía un mensaje con
Exception {
el formato declarado en tiempo,
Date now = new Date(); realiza un registro log y envía
mensaje de notificaciones
message.addTag(Tag.MSG_SEQ_NUM, seqNum);
message.addTag(Tag.SENDING_TIME,
Message.SENDING_TIME_FORMAT.format(now));
// Notifiy listeners
for (MessageListener ml : listeners) {
ml.processSentMessage(message);
}
output.write(msg.getBytes());
output.flush();
seqNum++;
}
public void startFixSession() throws Exception { Metodo que permite agregar a los
Message example = new
tag valores definidos en las
Message(Message.MSG_TYPE_FIX_SESSION_LOGON);
example.addTag(Tag.SENDER_COMP_ID, constantes finales declaras para ser
Message.SENDER_COMP_ID); enviados como una estructura de
example.addTag(Tag.TARGET_COMP_ID, mensaje.
Message.TARGET_COMP_ID);
example.addTag(Tag.ENCRYPT_METHOD, 0);
example.addTag(Tag.HEART_BT_INT,
ClientSession.TIMEOUT);
sendMessage(example);
}
put(tag.getNumber(), tag);
}
}
this.code = code;
}
return code;
}
}
public TransactionOrderMessage() { Metodo que hereda la
clase de orden de
super(MSG_TYPE_TRANSACTION_ORDER);
addTag(Tag.SENDER_COMP_ID, SENDER_COMP_ID); transacción de
addTag(Tag.TARGET_COMP_ID, TARGET_COMP_ID); mensajes y agrega tag
}
public void setDatatecFields(DatatecFields datatecFields) { Metodo que recibe
como parámetro un
addTag(new Tag(PRIMARY_USER_CODE,
datatecFields.getPrimaryUserCode())); campo de tipo
addTag(new Tag(USER, datatecFields.getUserCode())); datatecfield y agrega
addTag(new Tag(BRANCH, datatecFields.getBranch())); los campos usuario,
addTag(new Tag(INSTITUTION_CODE,
branch, código de
datatecFields.getInstitutionCode()));
addTag(new Tag(CITY, datatecFields.getCityCode())); institución y ciudad
}
public void setClass(Class msgClass) { Metodo que recibe
como parámetro un
addTag(new Tag(MESSAGE_CLASS, msgClass.getCode()));
} campo de tipo msgclass
y agrega el campo
mensaje
try{
// Interbank fields
Tag matDate =
msg.getTag(CurrentOrderMessage.MATURITY_DATE);
Tag days =
msg.getTag(CurrentOrderMessage.DAYS);
// CD BCR fields
Tag valueDateCDBCR =
msg.getTag(CurrentOrderMessage.VALUE_DATE);
Tag yieldCDBCR =
msg.getTag(CurrentOrderMessage.TERM);
// FI fields
Tag pricePercentageFI = msg
.getTag(CurrentOrderMessage.ASSIGNED_EFFECTIVE_AMOUNT);
log.debug("Market=" +
market.getValue().toString());
log.debug("Bid/Offer=" +
bidOffer.getValue());
log.debug("Code=" +
code.getValue().toString());
log.debug("Operation flag=" +
operationFlag.getValue().toString());
Market mkt =
markets.get(market.getStringValue());
// Market not yet received
// but orders on the same yes...
// create the market
if (mkt == null) {
mkt = new Market();
markets.put(mkt.getCode(), mkt);
}
if (matDate != null) {
try {
order.setMaturityDate(DatatecFields.DATATEC_DATE_FORMAT
.parse(matDate.getStringValue()));
} catch (Exception e) {
log.error("Error", e);
}
}
if (institutionCode != null) {
order.setInstitutionCode(institutionCode.getStringValue(
));
}
if (days != null) {
order.setDays(days.getIntegerValue());
}
if (valueDateCDBCR != null) {
order.setValueDateCDBCR(valueDateCDBCR.getIntegerValue()
);
}
if (yieldCDBCR != null) {
order.setYieldCDBCR(yieldCDBCR.getDoubleValue());
}
if (pricePercentageFI != null) {
order.setPricePercentageFI(pricePercentageFI.getDoubleVa
lue());
}
switch
(operationFlag.getValue().toString().charAt(0)) {
case 'I':
case 'M':
mkt.updateOrder(order);
break;
case 'B':
mkt.removeOrder(order);
break;
}
order.setMessage(msg);
ml.processCurrentOrderDataReceived(mkt, order);
}
}catch (Exception e) {
log.error("Error", e);
}
}
protected void receivePricesAmountsTradedData(Message msg) { Metodos que permite
recibir precios de los montos
Tag operationFlag = msg
de datos negociados, así
.getTag(PricesAmountsTradedMessage.OPERATION_FLAG); como agregar los valores a los
tag correspondente a cada
Tag time =
campo y realizar la validación
msg.getTag(PricesAmountsTradedMessage.TIME);
Tag date = de contenido de cada campo
msg.getTag(PricesAmountsTradedMessage.DATE); asignado.
Tag orderCode =
msg.getTag(PricesAmountsTradedMessage.ORDER_CODE);
Tag market =
msg.getTag(PricesAmountsTradedMessage.MARKET);
Tag bidOffer =
msg.getTag(PricesAmountsTradedMessage.BID_OFFER);
Tag valueDate =
msg.getTag(PricesAmountsTradedMessage.VALUE_DATE);
Tag deliveryDate =
msg.getTag(PricesAmountsTradedMessage.DELIVERY_DATE);
Tag days =
msg.getTag(PricesAmountsTradedMessage.DAYS);
Tag physicalCompensationFlag = msg
.getTag(PricesAmountsTradedMessage.PHYSICAL_COMPENSATION
_FLAG);
Tag bondIdentifier = msg
.getTag(PricesAmountsTradedMessage.BOND_IDENTIFIER);
Tag price =
msg.getTag(PricesAmountsTradedMessage.PRICE);
Tag tradedNumber =
msg.getTag(PricesAmountsTradedMessage.TRADED_NUMBER);
Tag titleCode =
msg.getTag(PricesAmountsTradedMessage.TITLE_CODE);
Tag emitter =
msg.getTag(PricesAmountsTradedMessage.EMITTER);
Tag countryCode =
msg.getTag(PricesAmountsTradedMessage.COUNTRY_CODE);
Tag emitterCode =
msg.getTag(PricesAmountsTradedMessage.EMITTER_CODE);
Tag issueType =
msg.getTag(PricesAmountsTradedMessage.ISSUE_TYPE);
Tag currency =
msg.getTag(PricesAmountsTradedMessage.CURRENCY);
Tag interestRate =
msg.getTag(PricesAmountsTradedMessage.INTEREST_RATE);
Tag emissionDate =
msg.getTag(PricesAmountsTradedMessage.EMISSION_DATE);
Tag maturityDate =
msg.getTag(PricesAmountsTradedMessage.MATURITY_DATE);
Tag spotPrice =
msg.getTag(PricesAmountsTradedMessage.SPOT_PRICE);
Tag finalPrice =
msg.getTag(PricesAmountsTradedMessage.FINAL_PRICE);
Tag yieldRate =
msg.getTag(PricesAmountsTradedMessage.YIELD_RATE);
Tag effectiveMonthlyYieldRate = msg
.getTag(PricesAmountsTradedMessage.EFFECTIVE_MONTHLY_YIE
LD_RATE);
Tag orderCode1 =
msg.getTag(PricesAmountsTradedMessage.ORDER_CODE_1);
Tag titleName =
msg.getTag(PricesAmountsTradedMessage.TITLE_NAME);
Tag titleIdentifier = msg
.getTag(PricesAmountsTradedMessage.TITLE_IDENTIFIER);
Tag titleIdentifierAlternate = msg
.getTag(PricesAmountsTradedMessage.TITLE_IDENTIFIER_ALTE
RNATE);
Tag emitName =
msg.getTag(PricesAmountsTradedMessage.EMIT_NAME);
Tag emitNameShort = msg
.getTag(PricesAmountsTradedMessage.EMIT_NAME_SHORT);
Tag operationTicks = msg
.getTag(PricesAmountsTradedMessage.OPERATION_TICKS);
Tag registeredFlag = msg
.getTag(PricesAmountsTradedMessage.REGISTERED_FLAG);
Tag registerHour =
msg.getTag(PricesAmountsTradedMessage.REGISTER_HOUR);
Tag originFlag =
msg.getTag(PricesAmountsTradedMessage.ORIGIN_FLAG);
try {
if (bidOffer != null) {
if
(bidOffer.getStringValue().charAt(0) == Order.Side.BID
.getCode()) {
data.setSide(Order.Side.BID);
} else {
data.setSide(Order.Side.OFFER);
}
}
if (bondIdentifier != null) {
data.setBondIdentifier(bondIdentifier.getStringValue());
}
if (countryCode != null) {
data.setCountryCode(countryCode.getStringValue());
}
if (currency != null) {
data.setCurrency(currency.getStringValue());
}
if (time != null && date != null) {
data.setDateTime(DATATEC_DATE_TIME_FORMAT.parse(date
.getStringValue() + "-"
+ time.getStringValue()));
}
if (days != null) {
data.setDays(days.getIntegerValue());
}
if (deliveryDate != null) {
data.setDeliveryDate(DatatecFields.DATATEC_DATE_FORMAT
.parse(deliveryDate.getStringValue()));
}
if (effectiveMonthlyYieldRate != null) {
data.setEffectiveMontlhyYieldRate(effectiveMonthlyYieldR
ate
.getDoubleValue());
}
if (emissionDate != null) {
data.setEmissionDate(DatatecFields.DATATEC_DATE_FORMAT
.parse(emissionDate.getStringValue()));
}
if (emitName != null) {
data.setEmitterName(emitName.getStringValue());
}
if (emitNameShort != null) {
data.setEmitterShortName(emitNameShort.getStringValue())
;
}
if (emitter != null) {
data.setEmitter(emitter.getStringValue());
}
if (emitterCode != null) {
data.setEmitterCode(emitterCode.getStringValue());
}
if (finalPrice != null) {
data.setFinalPrice(finalPrice.getDoubleValue());
}
if (issueType != null) {
switch
(issueType.getStringValue().charAt(0)) {
case '1':
data.setIssueType(Order.IssueType.WITHOUT_INTERESTS_OR_S
INGLE_INTEREST_PAYMENT);
break;
case '2':
data.setIssueType(Order.IssueType.SEVERAL_PAYMENTS_OF_IN
TEREST_OR_CAPITAL);
break;
case '3':
data.setIssueType(Order.IssueType.WITHOUT_INTERESTS_OR_M
ATURITY_DATE);
break;
}
}
if (interestRate != null) {
data.setInterestRate(interestRate.getDoubleValue());
}
if (maturityDate != null) {
data.setMaturityDate(DatatecFields.DATATEC_DATE_FORMAT
.parse(maturityDate.getStringValue()));
}
if (operationTicks != null) {
data.setOperationTicks(operationTicks.getLongValue());
}
if (orderCode != null) {
data.setOrderCode(orderCode.getStringValue());
}
if (orderCode1 != null) {
data.setOrderCode1(orderCode1.getStringValue());
}
if (originFlag != null) {
switch
(originFlag.getStringValue().charAt(0)) {
case 'H':
data.setOrigin(StatisticData.Origin.HYBRID);
break;
case 'V':
data.setOrigin(StatisticData.Origin.VOICE);
break;
case 'E':
data.setOrigin(StatisticData.Origin.ELECTRONIC);
break;
}
}
if (physicalCompensationFlag != null) {
switch
(physicalCompensationFlag.getStringValue().charAt(0)) {
case 'F':
data.setCompensation(Order.Compensation.PHYSICAL);
break;
case 'N':
data.setCompensation(Order.Compensation.NON_DELIVERY);
break;
case 'R':
data.setCompensation(Order.Compensation.REFERENCE);
break;
case 'I':
data.setCompensation(Order.Compensation.INDICATIVE);
break;
case 'D':
data.setCompensation(Order.Compensation.DEFERRED_WITHDRA
L);
break;
}
}
if (price != null) {
data.setPrice(price.getDoubleValue());
}
if (registerHour != null) {
data.setRegisterHour(DatatecFields.DATATEC_TIME_FORMAT
.parse(registerHour.getStringValue()));
}
if (registeredFlag != null) {
switch
(registeredFlag.getStringValue().charAt(0)) {
case 'D':
data.setRegisterFlag(StatisticData.RegisterFlag.DIRECT_D
OLLAR);
break;
case 'R':
data.setRegisterFlag(StatisticData.RegisterFlag.REGISTER
ED);
break;
case 'P':
data.setRegisterFlag(StatisticData.RegisterFlag.HIT);
break;
case 'G':
data.setRegisterFlag(StatisticData.RegisterFlag.GIVEN);
break;
case 'T':
data.setRegisterFlag(StatisticData.RegisterFlag.TAKEN);
break;
}
}
if (spotPrice != null) {
data.setSpotPrice(spotPrice.getDoubleValue());
}
if (titleCode != null) {
data.setTitleCode(titleCode.getStringValue());
}
if (titleIdentifier != null) {
data.setTitleIdentifier(titleIdentifier.getStringValue()
);
}
if (titleIdentifierAlternate != null) {
data.setTitleAlternateIdentifier(titleIdentifierAlternat
e
.getStringValue());
}
if (titleName != null) {
data.setTitleName(titleName.getStringValue());
}
if (tradedNumber != null) {
data.setTradedNumber(tradedNumber.getIntegerValue());
}
if (valueDate != null) {
data.setValueDate(valueDate.getIntegerValue());
}
if (yieldRate != null) {
data.setYieldRate(yieldRate.getDoubleValue());
}
data.setMessage(msg);
if (market != null) {
data.setMarket(markets.get(market.getStringValue()));
switch
(operationFlag.getValue().toString().charAt(0)) {
case 'I':
case 'M':
markets.get(market.getStringValue()).updateStatisticsDat
a(
data);
break;
case 'B':
markets.get(market.getStringValue()).removeStatisticsDat
a(
data);
break;
}
for (MessageListener ml : listeners)
{
ml.processPricesAmountsTradedDataReceived(
markets.get(market.getStringValue()), data);
}
}
} catch (Exception e) {
log.error("Error", e);
}
}
tag.getValue().toString());
t.setValue(o);
} else {
t.setValue(tag.getValue());
}
return;
} catch (ParseException e) {
log.error(e);
tags.put(tag);
}
} else {
(tags.get(tag.getNumber())).setValue(tag.getValue());
}
} else {
tags.put(tag);
}
}
public String assemble() { Método que permite armar una
cadena de mensaje deacuerdo a
String message = beginString.toString();
los parámetros que requiere la
StringBuilder str = new StringBuilder(); estructura.
str.append(msgType.toString());
str.append(msgSeqNumber.toString());
str.append(senderCompId.toString());
str.append(sendingTime.toString());
str.append(targetCompId.toString());
bodyLength.setValue(str.length());
int sum = 0;
byte[] bytes = message.getBytes();
Tag.java: Clase java Tag se define variables estáticas finales, métodos get y
set, así como métodos para cálculos.
private static Logger log = Crea una variable estatica para almacenar
Logger.getLogger(Tag.class.getName());
datos de registros
public final static int BEGIN_STRING = 8; Declara varaiabes estáticas finales en la cual
public final static int BODY_LENGTH = 9;
se le asignan variabkes con valores
public final static int CHECK_SUM = 10;
public final static int MSG_TYPE = 35; constantes
public final static int MSG_SEQ_NUM = 34;
public final static int SENDER_COMP_ID = 49;
public final static int SENDING_TIME = 52;
public final static int TARGET_COMP_ID = 56;
public final static int ENCRYPT_METHOD = 98;
public final static int HEART_BT_INT = 108;
public final static int MESSAGE_ID = 19100;
public final static char DELIMITER = 1;
private int number; Se declaran las Variables privadas para
private Object value;
generales los métodos get y set
private Format valueFormat;
private String comment;
private String fieldName;
private boolean required;
private String asString;
public static Tag fromString(String keyValuePair) Metodo estatico que devuelve una
{
estructura de tipo tag, recibiendo como
int idx = keyValuePair.indexOf('='); argumento un key para el valor de pago
if (idx < 0) {
throw new IllegalArgumentException(
"Key/Value pair must be separated by '=' [" +
keyValuePair
+ "]");
}
String numberParam = keyValuePair.substring(0,
idx);
try {
int number = new Integer(numberParam);
Object value = keyValuePair.substring(idx + 1,
keyValuePair.length());
return new Tag(number, value);
} catch (Exception e) {
throw new
IllegalArgumentException(
"The left side
must be a number [" + numberParam + "]");
}
}
public Tag(int number, Object value) { Constructor Tag que permite recibir
this(number, null, value, false, null);
parámetro y objetos que forman parte de la
}
estructura tag.
public Tag(int number, String fieldName, Object
value, boolean required) {
this(number, fieldName, value, required,
null);
}
public Tag(int number, String fieldName, Object
value, boolean required,
Format valueFormat) {
this.number = number;
this.fieldName = fieldName;
this.required = required;
this.valueFormat = valueFormat;
setValue(value);
}
public String getComment() { Método get y set declarados para la
variable Comment
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public Object getValue() { Método get y set declarados para la
variable value
return value;
}
public void setComment(String comment) {
this.comment = comment;
}
public void setFieldName(String fieldName) { Método get y set declarados para la
variable FieldName
this.fieldName = fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public void setRequired(boolean required) { Método get y set declarados para la
variable Required
this.required = required;
}
public boolean isRequired() {
return required;
}
public String toString() { Método get y set declarados para la
variable toString
return asString;
}
public Format getValueFormat() { Método get y set declarados para la
variable ValueFormat
return valueFormat;
}
protected Object clone() throws Método que permite copiar los valores de
CloneNotSupportedException {
una estructura tag y los almacena en un
Tag newTag = new Tag(number, objeto
fieldName, value, required, valueFormat);
return newTag;
}
Método get declarados para la variable
public Integer getIntegerValue() {
IntegerValue
if (value != null) {
try {
Integer i = new
Integer(value.toString());
return i;
} catch (Exception e) {
log.error("Error", e);
}
}
return null;
}
public String getStringValue() { Método get declarados para la variable
StringValue
if (value != null) {
return value.toString();
}
return null;
}
public Long getLongValue(){ Método get declarados para la variable
if (value != null) {
StringValue
try {
Long i = new
Long(value.toString());
return i;
} catch (Exception e) {
log.error("Error", e);
}
}
return null;
}
public Double getDoubleValue() { Método get declarados para la variable
DoubleValue
if (value != null) {
try {
Double i = new
Double(value.toString());
return i;
} catch (Exception e) {
log.error("Error", e);
}
}
return null;
}
public String getFieldName() { Método get declarados para la variable
FieldName
return fieldName;
}
public int getLength() { Método get declarados para la variable
Length
return asString.length();
}
4. com.datatec.fix.ec
Tag tag =
msg.getTag(ECVI_InstrumentMessage.SHARE_CODE);
instrument.setUniqueCode(tag != null ?
tag
.getStringValue() : null);
tag =
msg.getTag(ECVI_InstrumentMessage.CURRENCY);
instrument.setCurrency(tag != null ?
tag
.getStringValue() : null);
tag =
msg.getTag(ECVI_InstrumentMessage.SHARE_SHORT_NAME);
instrument.setName(tag != null ? tag
.getStringValue() : null);
tag =
msg.getTag(ECVI_InstrumentMessage.INSTRUMENT_TYPE);
instrument.setType(tag != null ? tag
.getStringValue() : null);
instrument.setMessage(msg);
Tag operationFlag =
msg.getTag(ECVI_InstrumentMessage.OPERATION_FLAG);
switch
(operationFlag.getValue().toString().charAt(0)) {
case 'I':
case 'M':
viInstruments.put(instrument.getUniqueCode(),
instrument);
break;
case 'B':
viInstruments.remove(instrument.getUniqueCode
());
break;
}
ml.processInstrumentDataReceived(viInstrument
s, instrument);
}
Market market =
markets.get(marketTag.getStringValue());
if (market == null) {
return;
}
ecTOD.setCode(msg.getTag(TransactionOrderMess
age.TRADE_UNIQUE_CODE)
.getStringValue());
Tag shareCode =
msg.getTag(TransactionOrderMessage.SHARE_CODE
);
ecTOD.setAcc(shareCode != null ?
shareCode.getStringValue() : null);
ecTOD.setType(msg.getTag(TransactionOrderMess
age.TITLE_IDENTIFIER)
.getStringValue());
Tag price =
msg.getTag(TransactionOrderMessage.PRICE);
ecTOD.setPrice(price != null ?
price.getDoubleValue() : 0);
ecTOD.setTradedNumber(msg.getTag(TransactionO
rderMessage.TRADED_NUMBER)
.getIntegerValue());
ecTOD.setDate(msg.getTag(TransactionOrderMess
age.DATE).getStringValue());
ecTOD.setOperationTime(msg.getTag(
TransactionOrderMessage.OPERATION_TIME).getSt
ringValue());
Tag valueDate =
msg.getTag(TransactionOrderMessage.VALUE_DATE);
ecTOD.setValueDate(valueDate != null ?
valueDate.getIntegerValue() : 0);
Tag bidOffer =
msg.getTag(TransactionOrderMessage.BID_OR_OFFER);
Tag issuerCode =
msg.getTag(TransactionOrderMessage.ISSUER_CODE);
ecTOD.setIssuerCode(issuerCode != null
? issuerCode.getStringValue()
: "");
Tag titleCode =
msg.getTag(TransactionOrderMessage.TITLE_CODE);
ecTOD.setTitleCode(titleCode != null ?
titleCode.getStringValue() : "");
Tag currency1c =
msg.getTag(TransactionOrderMessage.CURRENCY_1C);
ecTOD.setCurrency1c(currency1c != null
? currency1c.getStringValue()
: "");
Tag nominalValue =
msg.getTag(TransactionOrderMessage.NOMINAL_VALUE);
ecTOD.setNominalValue(nominalValue !=
null ? nominalValue
.getDoubleValue() : 0);
Tag interestRate =
msg.getTag(TransactionOrderMessage.INTEREST_RATE);
ecTOD.setInterestRate(interestRate !=
null ? interestRate
.getDoubleValue() : 0);
Tag days =
msg.getTag(TransactionOrderMessage.DAYS);
ecTOD.setDays(days != null ?
days.getIntegerValue() : 0);
Tag yield =
msg.getTag(TransactionOrderMessage.YIELD);
ecTOD.setYield(yield != null ?
yield.getDoubleValue() : 0);
Tag yieldRate =
msg.getTag(TransactionOrderMessage.YIELD_RATE);
ecTOD.setYieldRate(yieldRate != null ?
yieldRate.getDoubleValue() : 0);
Tag coupon =
msg.getTag(TransactionOrderMessage.COUPON);
if (coupon != null &&
coupon.getStringValue().charAt(0) == 'S') {
ecTOD.setCoupon(true);
}
if (bidOffer.getStringValue().charAt(0)
== 'O') {
ecTOD.setBuyerInstitutionCity(msg.getTag(
TransactionOrderMessage.ORDER_1_CITY_3C).getS
tringValue());
ecTOD.setBuyerInstitutionName(msg.getTag(
TransactionOrderMessage.ORDER_1_INSTITUTION_S
HORT_NAME)
.getStringValue());
ecTOD.setBuyerInstitutionUser(msg.getTag(
TransactionOrderMessage.ORDER_1_USER_NAME).ge
tStringValue());
ecTOD.setSellerInstitutionCity(msg.getTag(
TransactionOrderMessage.ORDER_CITY_3C).getStr
ingValue());
ecTOD.setSellerInstitutionName(msg.getTag(
TransactionOrderMessage.ORDER_INSTITUTION_SHO
RT_NAME)
.getStringValue());
ecTOD.setSellerInstitutionUser(msg.getTag(
TransactionOrderMessage.ORDER_USER_NAME).getS
tringValue());
} else {
ecTOD.setSellerInstitutionCity(msg.getTag(
TransactionOrderMessage.ORDER_1_CITY_3C).getS
tringValue());
ecTOD.setSellerInstitutionName(msg.getTag(
TransactionOrderMessage.ORDER_1_INSTITUTION_S
HORT_NAME)
.getStringValue());
ecTOD.setSellerInstitutionUser(msg.getTag(
TransactionOrderMessage.ORDER_1_USER_NAME).ge
tStringValue());
ecTOD.setBuyerInstitutionCity(msg.getTag(
TransactionOrderMessage.ORDER_CITY_3C).getStr
ingValue());
ecTOD.setBuyerInstitutionName(msg.getTag(
TransactionOrderMessage.ORDER_INSTITUTION_SHO
RT_NAME)
.getStringValue());
ecTOD.setBuyerInstitutionUser(msg.getTag(
TransactionOrderMessage.ORDER_USER_NAME).getS
tringValue());
ecTOD.setMessage(msg);
Tag operationFlag =
msg.getTag(TransactionOrderMessage.OPERATION_FLAG);
switch
(operationFlag.getStringValue().charAt(0)) {
case 'I':
case 'M':
market.getTransactionOrders().put(ecTOD.getCo
de(), ecTOD);
break;
case 'B':
market.getTransactionOrders().remove(ecTOD.ge
tCode());
}
ml.processTransactionOrderDataReceived(market
, ecTOD);
}
}
closeFrame();
}
});
setTitle("Datatec - FIX Client example - " +
version);
public void
actionPerformed(ActionEvent arg0) {
connect();
}
});
public void
actionPerformed(ActionEvent arg0) {
disconnect();
}
});
menuBar.add(menuOptions);
mnuInstruments = new
JMenuItem("Instruments");
mnuInstruments.addActionListener(new
ActionListener() {
public void
actionPerformed(ActionEvent arg0) {
showInstruments();
}
});
mnuReceivedData.add(mnuInstruments);
menuBar.add(mnuReceivedData);
setJMenuBar(menuBar);
modelMessages = new
MessageTableModel(MessageTableModel.Column.TIME,
MessageTableModel.Column.SEND_RECEIVE,
MessageTableModel.Column.SEQ_NUM,
MessageTableModel.Column.TYPE,
MessageTableModel.Column.DETAIL);
tblMessages = new
PrintableColorTable(modelMessages);
setColumnWidth(tblMessages.getColumnModel().getCol
umn(0), 80);
setColumnWidth(tblMessages.getColumnModel().getCol
umn(1), 30);
setColumnWidth(tblMessages.getColumnModel().getCol
umn(2), 40);
setColumnWidth(tblMessages.getColumnModel().getCol
umn(3), 40);
tblMessages.addMouseListener(new
MouseAdapter() {
public void mouseClicked(MouseEvent e)
{
if (e.getClickCount() == 2) {
showMessageForLine(tblMessages);
}
}
});
tblMessages.setAutoCreateRowSorter(true);
.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_S
CROLLBAR_ALWAYS);
scrollPane
.setHorizontalScrollBarPolicy(JScrollPane.HORIZONT
AL_SCROLLBAR_ALWAYS);
setLayout(new BorderLayout());
add(pane, BorderLayout.CENTER);
gbc.anchor = GridBagConstraints.LINE_END;
tmp.add(new JLabel("Branch : "), gbc);
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridx++;
gbc.gridwidth = 2;
tmp.add(lblBranch, gbc);
gbc.anchor = GridBagConstraints.LINE_END;
gbc.gridwidth = 1;
tmp.add(new JLabel("User name : "), gbc);
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridwidth = 2;
gbc.gridx++;
tmp.add(lblUser, gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.anchor = GridBagConstraints.LINE_END;
gbc.gridwidth = 1;
tmp.add(new JLabel("PU code : "), gbc);
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridx++;
gbc.gridwidth = 2;
tmp.add(lblPUCode, gbc);
gbc.anchor = GridBagConstraints.LINE_END;
gbc.gridwidth = 1;
tmp.add(new JLabel("User code : "), gbc);
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridwidth = 2;
gbc.gridx++;
tmp.add(lblUserCode, gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.anchor = GridBagConstraints.LINE_END;
gbc.gridwidth = 1;
tmp.add(new JLabel("Details : "), gbc);
gbc.anchor = GridBagConstraints.LINE_START;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth =
GridBagConstraints.REMAINDER;
gbc.gridx = GridBagConstraints.RELATIVE;
tmp.add(lblLastStatus, gbc);
add(tmp, BorderLayout.SOUTH);
setSize(600, 300);
GraphicsEnvironment env =
GraphicsEnvironment
.getLocalGraphicsEnvironment();
Rectangle bounds =
env.getMaximumWindowBounds();
int py = (bounds.height -
this.getSize().height) / 2;
int px = (bounds.width -
this.getSize().width) / 2;
setLocation(px, py);
}
private void disconnect() { Metodo que permite la desconexión
if (session != null &&
de cliente datatec y cerrar el medio
session.isConnected()) {
try { de comunicación caso contrario
session.close(); enviara un mensaje de error por la
} catch (Exception e) { consola.
log.error("Error - ", e);
}
}
}
private void saveUserPreferences(Properties Metodo que permite almacenar los
userPreferences)
parámetros de configuración que se
throws Exception {
encuentran en los archivos de
// Method 1 configuración , así mismo valida si se
// URL url = encuentra creado el archivo o no
getClass().getResource("/cfix.properties");
caso contrario crea un archivo de
// log.info("Archivo de configuración: " +
url); configuración nuevo
// File f = new File(url.toURI());
// if (!f.exists()) {
// f.createNewFile();
// }
// OutputStream os = new
FileOutputStream(f);
// userPreferences.store(os,
// "#Datatec FIX client
example\n#Configuration file");
// Method 2
// File propFile = new File(runningPath +
"conf/cfix.properties");
// relative path
File propFile = new
File("conf/cfix.properties");
if (!propFile.exists()) {
propFile.createNewFile();
}
log.debug("Saving file to: " + propFile);
OutputStream os = new
FileOutputStream(propFile.getAbsoluteFile());
userPreferences.store(os,
"#Datatec FIX client
example\n#Configuration file");
}
private Properties loadUserPreferences() { Metodo que permite cargar los
valores de los parámetros
Properties defaultProperties = new
Properties(); almacenados en el archivo de
try { configuración para mostrarlo en el
formulario de configuración.
// Method 1
// InputStream is =
//
getClass().getResourceAsStream("/cfix.properties");
// defaultProperties.load(is);
// is.close();
// Method 2
File f = new
File(ClientFrame.class.getProtectionDomain()
.getCodeSource().getLocation().getPath());
runningPath = f.getParent();
log.debug("Running in: " +
runningPath);
// relative path
File propFile = new
File("conf/cfix.properties");
propFile.getAbsoluteFile());
defaultProperties.load(fis);
return defaultProperties;
} catch (Exception e) {
log.error("Error", e);
}
return null;
}
csd.setLocation(p);
csd.setVisible(true);
if (csd.getOption() ==
AbstractDialog.Option.OK) {
if
(SESSION_MX.equals(marketGroup)) {
session = new
MXClientSession(csd.getServer(), port);
} else if
(SESSION_EC.equals(marketGroup)) {
session = new
ECClientSession(csd.getServer(), port);
frmInstruments =
new ECInstrumentsFrame();
} else {
session = new
DefaultClientSession(csd.getServer(),
port);
mnuInstruments.setEnabled(false);
}
session.getDatatecFields().setMarketGroup(
userPreferences.getProperty("session"));
userPreferences.setProperty("server",
csd.getServer());
userPreferences.setProperty("port", "" +
csd.getPort());
userPreferences.setProperty("user",
csd.getUser());
userPreferences.setProperty("branch",
csd.getBranch());
userPreferences.setProperty("language",
csd.getLanguage());
userPreferences.setProperty("password",
csd.getPassword());
saveUserPreferences(userPreferences);
session.addMessageListener(this);
datatecFields =
session.getDatatecFields();
session.open();
datatecFields.setBranch(csd.getBranch());
datatecFields.setUserName(csd.getUser());
datatecFields.setPassword(csd.getPassword());
session.setLanguage(csd.getLanguage());
if
(session.isConnected()) {
session.startFixSession();
if
(SESSION_MX.equals(marketGroup)) {
((MXInstrumentsFrame) frmInstruments)
.setFixSession(session);
}
}
} catch (Exception e) {
log.error("Error - ", e);
}
} else {
txaReceivedMessages.append(MessageTableModel.MESSA
GE_TIME
.format(new Date())
+ "\tReceived message
msgType=["
+ msgType
+ "]\n" + message.toString() +
"\n");
txaReceivedMessages.setCaretPosition(txaReceivedMe
ssages.getDocument()
.getLength());
modelMessages.addReceivedMessage(message);
Rectangle r =
tblMessages.getCellRect(tblMessages.getRowCount() - 1,
tblMessages.getColumnCount(),
true);
r.height += 20;
tblMessages.scrollRectToVisible(r);
txaReceivedMessages.append(MessageTableModel.MESSA
GE_TIME
.format(new Date())
+ "\tSent message msgType=["
+ msgType
+ "]\n" + message.toString() +
"\n");
txaReceivedMessages.setCaretPosition(txaReceivedMe
ssages.getDocument()
.getLength());
modelMessages.addSentMessage(message);
Rectangle r =
tblMessages.getCellRect(modelMessages.getRowCount() - 1,
modelMessages.getColumnCount(),
true);
r.height += 20;
tblMessages.scrollRectToVisible(r);
}
public void processCurrentOrderDataReceived(Instrument Metodo que procesa los datos de
instrument,
ordenes actuales
Order order) {
if (instrument != null) {
if (marketGroup.equals(SESSION_MX)) {
((MXInstrumentsFrame)
frmInstruments)
.refresh((MXInstrument) instrument);
}
}
}
public void processInstrumentDataReceived( Método que recibe una interfaz
SortedMap<String, Instrument>
SortedMap de tipo instrumento y
instruments, Instrument instrument) {
una estructura instrumento para
frmInstruments.setInstruments(new asignarlo al formulario instrument
ArrayList<Instrument>(instruments
.values()));
}
public void processMarketDataReceived(Map<String, Market> Metodo que recibe y procesa los
markets,
datos del mercado, así mismo
Market market) {
mostrar el menú de la opción
// Market frames mercado (Market)
if (market.getType() !=
Market.Type.UNDEFINED
&&
!marketFrames.containsKey(market.getCode())) {
MarketFrame mktFrame = new
MarketFrame(market);
marketFrames.put(market.getCode(),
mktFrame);
}
mnuMarkets.removeAll();
// Market menus
JMenuItem tmp = new
JMenuItem(m.getFullName());
if (m.getAccess() ==
Market.Access.FORBIDDEN) {
tmp.setEnabled(false);
}
tmp.addActionListener(new
ActionListener() {
public void
actionPerformed(ActionEvent arg0) {
showMarket(m.getCode());
}
});
mnuMarkets.add(tmp);
}
}
private void showMarket(String mktCode) { Método que permite mostrar los
valores referente al código del
Market mkt =
session.getMarkets().get(mktCode); mercado
if (mkt != null) {
DatatecFrame marketFrame =
marketFrames.get(mktCode);
if (marketFrame != null) {
if (!marketFrame.isVisible()) {
Point p =
this.getLocation();
int pX = p.x + 30;
if (pX +
marketFrame.getSize().width >= 1024) {
pX = (1024 -
marketFrame.getSize().width) / 2;
}
} else {
JOptionPane.showMessageDialog(this,
"No market window
available for\n" + str.toString(),
mkt.getFullName(),
JOptionPane.WARNING_MESSAGE);
}
}
}
public void processLogonAccepted(String branch, String Método que pemite asignar valores
user, String puCode,
a los objetos cuando el logeo es
String userCode) {
aceptado
lblBranch.setText(branch);
lblUser.setText(user);
lblPUCode.setText(puCode);
lblUserCode.setText(userCode);
String detail = "Logon accepted";
lblLastStatus.setText(detail);
}
public void processLogonDenied(String branch, String Método que pemite asignar valores
user, String flag,
a los objetos cuando el logeo es
String reason) {
denegado
lblBranch.setText(branch);
lblUser.setText(user);
lblPUCode.setText("");
lblUserCode.setText("");
String detail = flag + " - " + reason;
lblLastStatus.setText(detail);
}
private static void createAndShowGUI() { Método que permite cargar la
interfaz gráfica de usuario
ClientFrame mainWindow = new ClientFrame();
mainWindow.setVisible(true);
}
public static void main(String[] args) { Define el método principal de la
clase y define la carga de la interfaz
Locale en = new Locale("en");
Locale.setDefault(en); grafica de usuario
JComponent.setDefaultLocale(en);
javax.swing.SwingUtilities.invokeLater(new
Runnable() {
createAndShowGUI();
}
});
}
public void processConnectionClosed() { Cierra todo tipo de conexión
aperturada
lblLastStatus.setText("Connection closed");
// instruments.clear();
frmInstruments.setInstruments(null);
}
public void processCurrentOrderDataReceived(Market Permite actualizar los valores
market, Order order) {
contenidos en el formulario
MarketFrame mktFrame =
marketFrames.get(market.getCode());
if (mktFrame != null) {
mktFrame.refresh(order);
}
}
public void processPricesAmountsTradedDataReceived(Market Método que permite procesar el
market,StatisticData statistics) {
precio del monto negociado y
MarketFrame mktFrame =
marketFrames.get(market.getCode()); refresca los datos de la entidad
if (mktFrame != null) { statistics
StatisticsFrame stFrame =
mktFrame.getStatisticsFrame();
stFrame.refresh(statistics);
}
}
private void setColumnWidth(TableColumn column, int Método que define los parámetros
width) {
con los que se configura las
column.setWidth(width); columnas de una Tabla
column.setPreferredWidth(width);
column.setMaxWidth(width);
column.setMinWidth(width);
}
public void processTransactionOrderDataReceived(Market Metodo que procesa las
market,TransactionOrderData toData) {
transacciones de las ordenes de
MarketFrame mktFrame =
marketFrames.get(market.getCode()); datos recibidas
if (mktFrame != null) {
mktFrame.refresh(market.getTransactionOrderData());
}
}
if (props != null) {
txtServer.setText(props.getProperty("server"));
txtPort.setText(props.getProperty("port"));
txtUser.setText(props.getProperty("user"));
txtBranch.setText(props.getProperty("branch"));
txtPassword.setText(props.getProperty("password"))
;
txtLanguage.setText(props.getProperty("language"))
;
txtSession.setText(props.getProperty("session"));
} else {
txtServer.setText("localhost");
txtPort.setText("5011");
txtUser.setText("BKMONEX1");
txtBranch.setText("MOXMMEXA");
txtLanguage.setText("2");
txtPassword.setText("datatec2");
}
JPanel tmp = new JPanel(new
GridBagLayout());
GridBagConstraints gbc = new
GridBagConstraints();
gbc.weightx = 1;
gbc.weighty = 1;
gbc.gridheight = 1;
gbc.gridwidth = 1;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(1, 2, 2, 4);
gbc.anchor = GridBagConstraints.LINE_END;
tmp.add(new JLabel("DFIX server : "), gbc);
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth = 3;
tmp.add(txtServer, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridy++;
gbc.gridx = 0;
gbc.anchor = GridBagConstraints.LINE_END;
tmp.add(new JLabel("Port : "), gbc);
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.gridwidth = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
tmp.add(txtPort, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridy++;
gbc.gridx = 0;
gbc.anchor = GridBagConstraints.LINE_END;
tmp.add(new JLabel("Branch : "), gbc);
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.gridwidth = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
tmp.add(txtBranch, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridy++;
gbc.gridx = 0;
gbc.anchor = GridBagConstraints.LINE_END;
tmp.add(new JLabel("User : "), gbc);
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.gridwidth = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
tmp.add(txtUser, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridy++;
gbc.gridx = 0;
gbc.anchor = GridBagConstraints.LINE_END;
tmp.add(new JLabel("Password : "), gbc);
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.gridwidth = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
tmp.add(txtPassword, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridy++;
gbc.gridx = 0;
gbc.anchor = GridBagConstraints.LINE_END;
tmp.add(new JLabel("Language (EN=2, ES=1) :
"), gbc);
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.gridwidth = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
tmp.add(txtLanguage, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridy++;
gbc.gridx = 0;
gbc.anchor = GridBagConstraints.LINE_END;
tmp.add(new JLabel("Session (Mkt. grp.) :
"), gbc);
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.gridwidth = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
tmp.add(txtSession, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
add(tmp, BorderLayout.CENTER);
pack();
setResizable(false);
center();
}
public String getServer() { Metodos get y set que se definen a
las variables que intervendrán en el
return txtServer.getText();
} proceso de comunicación con el
cliente.
public int getPort() {
try {
return
Integer.parseInt(txtPort.getText());
} catch (Exception e) {
return 0;
}
}
return txtBranch.getText();
}
public String getUser() {
return txtUser.getText();
}
return new
String(txtPassword.getPassword());
}
return txtLanguage.getText();
}
"/toolbarButtonGraphics/general/SendMail16.gif",
"Message for this instrument",
23);
btnMessage.addActionListener(new
ActionListener() {
@Override
public void actionPerformed(ActionEvent
arg0) {
showInstrumentMessage();
}
});
@Override
public void actionPerformed(ActionEvent
arg0) {
dispose();
}
});
pnlButtons.setBorder(BorderFactory.createMatteBorder(
1, 0, 0, 0,
Color.LIGHT_GRAY));
pnlButtons.add(btnMessage);
pnlButtons.add(btnClose);
pnlButtons.getInputMap(JComponent.WHEN_IN_FOCUSED_WIN
DOW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
"escPressed");
pnlButtons.getActionMap().put("escPressed",
new AbstractAction("escPressed") {
public void
actionPerformed(ActionEvent actionEvent) {
dispose();
}
});
add(pnlButtons, BorderLayout.SOUTH);
pack();
}
protected void showInstrumentMessage() { Metodo que permite mostrar el
showMessage(instrument);
mensaje de la entidad
}
instrumento
protected abstract void createGUI(JPanel panel, Metodo que permite crear una
GridBagConstraints gbc);
interfaz gráfica de usuario
protected JTextField createTxtField(String text, int cols)
{ retornando el valor de un objeto
JTextField tmp = new JTextField(cols); JTextField
tmp.setEditable(false);
if (text != null) {
tmp.setText(text);
}
return tmp;
}
No se encuentra código malicioso
@Override
public void actionPerformed(ActionEvent arg0) {
showMarketInfo();
}
});
"/toolbarButtonGraphics/general/History24.gif",
"Prices & Amounts traded");
btnPricesAmounts.addActionListener(new
ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
showPricesAmountsTraded();
}
});
toolBar.add(btnMessage);
toolBar.add(btnMarketDetails);
toolBar.add(btnPricesAmounts);
toolBar.setFloatable(false);
if (market.getType() == Market.Type.EC_AUCTIONS
|| market.getType() == Market.Type.EC_FI
|| market.getType() == Market.Type.EC_VI) {
modelTransactionOrders = new TransactionOrderTableModel(
getColumns(market));
final JTable tblTO = new
PrintableColorTable(modelTransactionOrders);
tblTO.addMouseListener(new
MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
showMessageForLine(tblTO);
}
}
});
JScrollPane scrollPane = new JScrollPane(tblTO);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTIC
AL_SCROLLBAR_ALWAYS);
btnPricesAmounts.setEnabled(false);
add(toolBar, BorderLayout.NORTH);
add(scrollPane, BorderLayout.CENTER);
setSize(900, 250);
} else {
pnlTop.add(toolBar);
createBidOfferLayout(market, pnlTop);
}
}
"/toolbarButtonGraphics/general/Copy24.gif",
"Copy message to clipboard");
btnCopy.addActionListener(new
ActionListener() {
@Override
public void
actionPerformed(ActionEvent arg0) {
doCopy();
}
});
"/toolbarButtonGraphics/general/Save24.gif",
"Save message to file");
btnSave.addActionListener(new
ActionListener() {
@Override
public void
actionPerformed(ActionEvent arg0) {
doSave();
}
});
"/toolbarButtonGraphics/general/Find24.gif", "Find
in message");
btnFind.addActionListener(new
ActionListener() {
@Override
public void
actionPerformed(ActionEvent arg0) {
doFind();
}
});
@Override
public void
actionPerformed(ActionEvent arg0) {
doViewTabs();
}
});
"/toolbarButtonGraphics/general/Refresh24.gif",
"View original");
btnViewOriginal.addActionListener(new
ActionListener() {
@Override
public void
actionPerformed(ActionEvent arg0) {
doViewOriginal();
}
});
toolBar.add(btnSave);
toolBar.add(btnViewTabs);
toolBar.add(btnViewOriginal);
toolBar.add(btnCopy);
toolBar.add(txtToFind);
toolBar.add(btnFind);
add(toolBar, BorderLayout.NORTH);
strMessage = message.toString();
strMessage = strMessage.replaceAll("" +
Tag.DELIMITER, "\n");
txtArea = new JTextArea();
txtArea.setText(strMessage);
highlighter = txtArea.getHighlighter();
highlightPainter = new
DefaultHighlighter.DefaultHighlightPainter(
txtArea.getSelectionColor());
scroll.setVerticalScrollBarPolicy(JScrollPane.VERT
ICAL_SCROLLBAR_ALWAYS);
add(scroll, BorderLayout.CENTER);
setSize(300, 400);
txtArea.setSelectionStart(0);
txtArea.setSelectionEnd(0);
scroll.getInputMap(JComponent.WHEN_IN_FOCUSED_WIND
OW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
"escPressed");
scroll.getActionMap().put("escPressed",
new
AbstractAction("escPressed") {
public void
actionPerformed(ActionEvent actionEvent) {
dispose();
}
});
try {
if (!file.exists()) {
file.createNewFile();
}
FileWriter fstream = new
FileWriter(file);
BufferedWriter out = new
BufferedWriter(fstream);
out.write(strMessage);
// Close the output stream
out.close();
} catch (Exception e) {
log.error("Error", e);
}
}
}
private void doFind() { Metodo que permite realizar de
highlighter.removeAllHighlights();
contenido en un objeto textArea, si
String search = txtToFind.getText().trim().toLowerCase();
if (!"".equals(search)) { lo ubica muestra el índice e ilumina
int start = txtArea.getSelectionEnd();
su ubicación, caso contrario realiza
int idx = strMessage.toLowerCase().indexOf(search,
start); un registro log de error.
if (idx >= 0) {
txtArea.setSelectionStart(idx);
txtArea.setSelectionEnd(idx + search.length());
try {
highlighter.addHighlight(txtArea.getSelectionStart
(),
txtArea.getSelectionEnd(), highlightPainter);
} catch (BadLocationException e) {
log.error("Error", e);
}
} else {
txtArea.setSelectionStart(0);
txtArea.setSelectionEnd(0);
}
}
}
this.title = title;
}
@Override
public String getTitle() {
return title;
}
@Override
public Class<?> getType() {
if(this == SEQ_NUM){
return Integer.class;
}
return String.class;
}
}
private List<String> sendReceiveList; Se declara lista privada de tipo
private List<String> timeStamps;
cadena
public MessageTableModel(Column... columns) { Metodo que define el modelo
super(columns);
de mensaje de la tabla, se
sendReceiveList = new ArrayList<String>();
objectList = new ArrayList<Message>(); declara arreglos de lista de tipo
timeStamps = new ArrayList<String>(); cadena y de estructura mensaje
}
public void addReceivedMessage(Message m) { Método que recibe mensaje y
los añade en un objeto de lista ,
((List<Message>) objectList).add(m);
sendReceiveList.add("R"); así mismo agrega la fecha con
timeStamps.add(MESSAGE_TIME.format(new una estructura formateada
Date()));
fireTableDataChanged();
}
public void addSentMessage(Message m) { Método que envia mensaje y los
añade en un objeto de lista, así
((List<Message>) objectList).add(m);
sendReceiveList.add("S"); mismo agrega la fecha con una
timeStamps.add(MESSAGE_TIME.format(new estructura formateada.
Date()));
fireTableDataChanged();
}
public Object getValueAt(int rowIndex, int columnIndex) { Método que obtiene un valor
de una celda especificándole la
if (rowIndex >= objectList.size() ||
columnIndex > titles.length) { fila y la columna, así mismo
return null; retorna el valor de la columna
} de acuerdo a la columna
seleccionada, caso contrario
Column column = (Column)
columns.get(columnIndex); devuelve un valor nulo.
if (column == Column.SEND_RECEIVE) {
return sendReceiveList.get(rowIndex);
}
switch (column) {
case TIME:
return timeStamps.get(rowIndex);
case TYPE:
return ((Message)
objectList.get(rowIndex)).getTag(Tag.MSG_TYPE)
.getStringValue();
case DETAIL:
return ((Message)
objectList.get(rowIndex));
case SEQ_NUM:
return ((Message)
objectList.get(rowIndex)).getTag(Tag.MSG_SEQ_NUM)
.getIntegerValue();
}
return null;
}
if (e.getClickCount() == 2) {
showMessageForLine(tblStatistics);
}
}
});
.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCR
OLLBAR_ALWAYS);
add(scrollPaneStatistics,
BorderLayout.CENTER);
int width = 70 *
modelStatistics.getColumnCount();
if (width > 1024) {
width = 1000;
}
setSize(width, 400);
}
private StatisticsTableModel.Column[] getColumns(Market Metodo que define el modelo de
market) {
las columnas que serán asignados
StatisticsTableModel.Column columns[] = null; al JTable de Statistics de acuerdo
switch (market.getType()) { al tipo de mercado.
case SPOT:
columns = new
StatisticsTableModel.Column[] {
StatisticsTableModel.Column.TIME,
StatisticsTableModel.Column.PRICE,
StatisticsTableModel.Column.TRADED_NUMBER,
StatisticsTableModel.Column.REGISTERED_FLAG };
break;
case INTERBANK:
columns = new
StatisticsTableModel.Column[] {
StatisticsTableModel.Column.DAYS,
StatisticsTableModel.Column.TIME,
StatisticsTableModel.Column.PRICE,
StatisticsTableModel.Column.TRADED_NUMBER,
StatisticsTableModel.Column.REGISTERED_FLAG };
break;
case DEPOSIT_CERTIFICATES:
columns = new
StatisticsTableModel.Column[] {
StatisticsTableModel.Column.TIME,
StatisticsTableModel.Column.MATURITY_DATE,
StatisticsTableModel.Column.BOND_IDENTIFIER,
StatisticsTableModel.Column.DAYS,
StatisticsTableModel.Column.VALUE_DATE,
StatisticsTableModel.Column.EFFECTIVE_MONTHLY_YIELD_
RATE,
StatisticsTableModel.Column.TRADED_NUMBER,
StatisticsTableModel.Column.REGISTERED_FLAG };
break;
case FIXED_INCOME:
columns = new
StatisticsTableModel.Column[] {
StatisticsTableModel.Column.TIME,
StatisticsTableModel.Column.TITLE_CODE,
StatisticsTableModel.Column.EMITTER_CODE,
StatisticsTableModel.Column.CURRENCY,
StatisticsTableModel.Column.EMISSION_DATE,
StatisticsTableModel.Column.MATURITY_DATE,
StatisticsTableModel.Column.VALUE_DATE,
StatisticsTableModel.Column.DAYS,
StatisticsTableModel.Column.YIELD_RATE,
StatisticsTableModel.Column.PRICE,
StatisticsTableModel.Column.TRADED_NUMBER,
StatisticsTableModel.Column.REGISTERED_FLAG };
break;
default:
columns =
StatisticsTableModel.Column.values();
}
return columns;
}
public void refresh(StatisticData statistics) { Metodo que recibe una entidad
modelStatistics
de tipo statistics y lo asigna a un
.setObjectList(statistics.getMarket().getStatisticDa
ta()); objeto de tipo list
}
public void setMarket(Market market) { Metodo que asigna el valor de
nombre completo del mercado
if (market != null) {
jLblMarketName.setText(market.getFullName());
}
}
6. com.datatec.fix.gui.ec:
this.title = title;
}
@Override
public String getTitle() {
return title;
}
@Override
public Class<?> getType() {
if(this == COUPON){
return Boolean.class;
}
return String.class;
}
}
public Object getValueAt(int rowIndex, int Método que permite obtener un valor
columnIndex) {
de un JTable de acuerdo a una fila y
if (rowIndex >= objectList.size() || columna indicada, y retorna el valor
columnIndex > titles.length) { del campo que se ha indicado caso
return null; contrario devolverá un valor nulo
}
TransactionOrderData tmp =
(TransactionOrderData) objectList
.get(rowIndex);
Column column = (Column)
columns.get(columnIndex);
switch (column) {
case DATE:
return tmp.getDate();
case TIME:
return tmp.getOperationTime();
case BUYER_INSTITUTION:
return
tmp.getBuyerInstitutionName();
case BUYER_CITY:
return
tmp.getBuyerInstitutionCity();
case BUYER_USER:
return
tmp.getBuyerInstitutionUser();
case SELLER_INSTITUTION:
return
tmp.getSellerInstitutionName();
case SELLER_CITY:
return
tmp.getSellerInstitutionCity();
case SELLER_USER:
return
tmp.getSellerInstitutionUser();
case ACC:
return tmp.getAcc();
case TYPE:
return tmp.getType();
case SHARE_NAME:
return tmp.getShareName();
case PRICE:
return tmp.getPrice();
case NUMBER:
return tmp.getTradedNumber();
case TOTAL:
return "";
case VD:
return tmp.getValueDate();
case AVL:
return tmp.getIssuerCode();
case CLS:
return tmp.getTitleCode();
case CURRENCY_1C:
return tmp.getCurrency1c();
case NOMINAL_VALUE:
return tmp.getNominalValue();
case INTEREST_PCT:
return tmp.getInterestRate();
case DAYS:
return tmp.getDays();
case YIELD:
return tmp.getYield();
case YIELD_RATE:
return tmp.getYieldRate();
case COUPON:
return tmp.isCoupon();
return null;
}
this.title = title;
}
@Override
public String getTitle() {
return title;
}
@Override
public Class<?> getType() {
if(this == ACTIVE){
return Boolean.class;
}
return String.class;
}
}
public Object getValueAt(int rowIndex, int Método que permite obtener el valor
columnIndex) {
de una celda especificándole la fila y
if (rowIndex >= objectList.size() || columna, así mismo retorna un valor
columnIndex > titles.length) { de tipo objeto según el valor de la
return null; columna indicada caso contrario
}
devuelve el valor nulo
ECVI_Instrument tmp = (ECVI_Instrument)
objectList.get(rowIndex);
Column column = (Column)
columns.get(columnIndex);
switch (column) {
case COD:
return tmp.getUniqueCode();
case ACTIVE:
return tmp.isActive();
case TYPE:
return tmp.getType();
case NAME:
return tmp.getName();
case STATUS:
return null;
case CURRENCY:
return tmp.getCurrency();
}
return null;
}
InstrumentsTableModel.Column.ACTIVE,
InstrumentsTableModel.Column.TYPE,
InstrumentsTableModel.Column.NAME,
InstrumentsTableModel.Column.STATUS,
InstrumentsTableModel.Column.CURRENCY);
tblInstruments = new
PrintableColorTable(tblModel);
TableColumn column =
tblInstruments.getColumnModel().getColumn(3);
int width = 250;
column.setWidth(width);
column.setPreferredWidth(width);
column.setMaxWidth(width);
column.setMinWidth(width);
tblInstruments.addMouseListener(new
MouseAdapter() {
@Override
public void
mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2)
{
log.debug("double
click [r,c]: "
+
tblInstruments.getSelectedRow() + ","
+
tblInstruments.getSelectedColumn());
showInstrumentDetailFrame((ECVI_Instrument)
tblModel
.getObjectList().get(
tblInstruments.getSelectedRow()));
}
}
});
setLayout(new BorderLayout());
setSize(550, 450);
setTitle("EC - Variable Income
Instruments");
JScrollPane scroll = new
JScrollPane(tblInstruments);
scroll.setHorizontalScrollBarPolicy(JScrollPane
.HORIZONTAL_SCROLLBAR_NEVER);
scroll.setVerticalScrollBarPolicy(JScrollPane.V
ERTICAL_SCROLLBAR_ALWAYS);
add(scroll, BorderLayout.CENTER);
}
private void Metodo que permite definir el estado
showInstrumentDetailFrame(ECVI_Instrument instrument)
de visibilidad del formulario
{
ECInstrumentDetailFrame detailFrame =
new ECInstrumentDetailFrame(
instrument);
detailFrame.setVisible(true);
}
public void setInstruments(List<Instrument> Metodo que asigna el modelo al JTable
instruments) {
tblModel.setObjectList(instruments);
msgInstrument.getTag(
ECVI_InstrumentMessage.SHARE_FULL_NAME)
msgInstrument.getTag(
ECVI_InstrumentMessage.SHARE_SHORT_NAME)
gbc.gridx = 0;
gbc.gridy++;
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Nominal value : "),
gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
panel.add(
createTxtField(
msgInstrument.getTag(
ECVI_InstrumentMessage.SHARE_NOMINAL_VALUE)
msgInstrument.getTag(ECVI_InstrumentMessage.CODE_B
VG)
gbc.gridx = 0;
gbc.gridy++;
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Order unit : "), gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
Tag orderUnits =
msgInstrument.getTag(ECVI_InstrumentMessage.ORDER_UNITS);
panel.add(
createTxtField(
orderUnits != null
? orderUnits.getStringValue() : "", 5), gbc);
gbc.anchor = GridBagConstraints.LINE_END;
gbc.gridx = 3;
panel.add(new JLabel("Emitter : "), gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
panel.add(
createTxtField(
msgInstrument.getTag(
ECVI_InstrumentMessage.EMITTER_CODE)
gbc.gridx = 0;
gbc.gridy++;
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Maximum lot : "),
gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridwidth = 2;
Tag maxLot =
msgInstrument.getTag(ECVI_InstrumentMessage.MAXIMUM_LOT);
panel.add(
createTxtField(maxLot != null ?
maxLot.getStringValue() : "",
10), gbc);
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.LINE_END;
gbc.gridx = 3;
panel.add(new JLabel("Emitter name : "),
gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridwidth = 4;
panel.add(
createTxtField(
msgInstrument.getTag(
ECVI_InstrumentMessage.EMITTER_NAME)
gbc.gridx = 0;
gbc.gridy++;
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Currency : "), gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
panel.add(
createTxtField(
msgInstrument.getTag(ECVI_InstrumentMessage.CURREN
CY)
msgInstrument.getTag(
ECVI_InstrumentMessage.INSTRUMENT_TYPE)
gbc.gridx = 0;
gbc.gridy++;
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridwidth = 7;
gbc.fill = GridBagConstraints.HORIZONTAL;
JSeparator separator = new
JSeparator(SwingConstants.HORIZONTAL);
separator.setOpaque(false);
panel.add(separator, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
JLabel lbl = new JLabel(" BVG Data ");
Font f = lbl.getFont().deriveFont(Font.BOLD
+ Font.ITALIC);
lbl.setFont(f);
lbl.setOpaque(true);
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(lbl, gbc);
panel.setComponentZOrder(lbl, 0);
panel.setComponentZOrder(separator, 1);
gbc.gridx = 0;
gbc.gridy++;
gbc.anchor = GridBagConstraints.LINE_START;
panel.add(new JLabel("Ranks : "), gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Superior : "), gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
Tag upperRank =
msgInstrument.getTag(ECVI_InstrumentMessage.UPPER_RANK);
panel.add(
createTxtField(upperRank !=
null ? upperRank.getStringValue()
: "0", 5), gbc);
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Middle : "), gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
Tag middleRank = msgInstrument
.getTag(ECVI_InstrumentMessage.MIDDLE_RANK);
panel.add(
createTxtField(middleRank !=
null ? middleRank.getStringValue()
: "0", 5), gbc);
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Lower : "), gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
Tag lowerRank =
msgInstrument.getTag(ECVI_InstrumentMessage.LOWER_RANK);
panel.add(
createTxtField(lowerRank !=
null ? lowerRank.getStringValue()
: "0", 5), gbc);
gbc.gridx = 1;
gbc.gridy++;
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Suspended : "), gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
Tag suspended = msgInstrument
.getTag(ECVI_InstrumentMessage.SUSPENDED_FLAG);
panel.add(
createTxtField(suspended !=
null ? suspended.getStringValue()
: "0", 5), gbc);
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Hour : "), gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
Tag suspensionHour = msgInstrument
.getTag(ECVI_InstrumentMessage.SUSPENSION_HOUR);
panel.add(
createTxtField(
suspensionHour !=
null ? suspensionHour
.getTag(ECVI_InstrumentMessage.SUSPENSION_PRICE);
panel.add(
createTxtField(
suspensionPrice !=
null ? suspensionPrice
gbc.gridx = 1;
gbc.gridy++;
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Last trade : "), gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
Tag lastTradeDate = msgInstrument
.getTag(ECVI_InstrumentMessage.LAST_TRADE_DATE);
Tag lastTradeTime = msgInstrument
.getTag(ECVI_InstrumentMessage.LAST_TRADE_HOUR);
String lastTradeDateTime = "";
if (lastTradeDate != null) {
lastTradeDateTime =
lastTradeDate.getStringValue() + " ";
}
if (lastTradeTime != null) {
lastTradeDateTime +=
lastTradeTime.getStringValue();
}
panel.add(
createTxtField(lastTradeDateTime != null ?
lastTradeDateTime
: "", 10), gbc);
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Price : "), gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
Tag lastTradePrice = msgInstrument
.getTag(ECVI_InstrumentMessage.LAST_TRADE_PRICE);
panel.add(
createTxtField(
lastTradePrice !=
null ? lastTradePrice
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Amount : "), gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
Tag lastTradeAmount = msgInstrument
.getTag(ECVI_InstrumentMessage.LAST_TRADE_NUMBER);
panel.add(
createTxtField(
lastTradeAmount !=
null ? lastTradeAmount
gbc.gridx = 1;
gbc.gridy++;
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Tendency : "), gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
Tag tendency = msgInstrument
.getTag(ECVI_InstrumentMessage.LAST_TRADE_TENDENCY
);
panel.add(
createTxtField(tendency != null
? tendency.getStringValue()
: "", 5), gbc);
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Prev. day price : "),
gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
Tag lastDayPrice = msgInstrument
.getTag(ECVI_InstrumentMessage.PREVIOUS_DAY_BVG_PR
ICE);
panel.add(
createTxtField(
lastDayPrice !=
null ? lastDayPrice.getStringValue()
:
"0", 5), gbc);
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Prev. day. var. : "),
gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
Tag previousDayPriceVar = msgInstrument
.getTag(ECVI_InstrumentMessage.PREVIOUS_DAY_PRICE_
VARIATION);
panel.add(
createTxtField(
gbc.gridx = 0;
gbc.gridy++;
gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Last price for ranks :
"), gbc);
gbc.gridwidth = 1;
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
Tag ranksLastPrice = msgInstrument
.getTag(ECVI_InstrumentMessage.LAST_PRICE_FOR_RANK
S);
panel.add(
createTxtField(
ranksLastPrice !=
null ? ranksLastPrice
.getTag(ECVI_InstrumentMessage.PREVIOUS_MONTH_PRIC
E);
panel.add(
createTxtField(
prevMonthPrice !=
null ? prevMonthPrice.getStringValue()
:
"0", 5), gbc);
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Prev. month var. : "),
gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
Tag prevMonthVar = msgInstrument
.getTag(ECVI_InstrumentMessage.PREVIOUS_MONTH_PRIC
E_VARIATION);
panel.add(
createTxtField(
prevMonthVar !=
null ? prevMonthVar.getStringValue()
:
"0", 5), gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.LINE_END;
panel.add(new JLabel("Max. mkt. collocation
date : "), gbc);
gbc.gridwidth = 1;
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.anchor = GridBagConstraints.LINE_START;
Tag maxCollocationDate = msgInstrument
.getTag(ECVI_InstrumentMessage.MAXIMUM_MARKET_COLL
OCATION_DATE);
panel.add(
createTxtField(
maxCollocationDate
!= null ? maxCollocationDate
this.title = title;
this.type = type;
}
@Override
public String getTitle() {
return title;
}
@Override
public Class<?> getType() {
return type;
}
}
public InstrumentsTableModel() { Método que hereda las columnas que
contendrá el JTable de Instrumentos
super(Column.LINE, Column.TERM_TEXT,
Column.TV_IDENTIFIER,
Column.BUY_ORDERS,
Column.SELL_ORDERS);
}
public Object getValueAt(int rowIndex, int Metodo que obtene el valor de una
columnIndex) {
celda tomando como valor la fila y la
if (rowIndex >= objectList.size() || columna la cual se ha seleccionado. Se
columnIndex > titles.length) { obtine los valores de la celda para
return null; realizar operaciones de cálculos y
} validaciones, se muestra datos de la
JTable Instrument.
Object tmp = objectList.get(rowIndex);
Column column = (Column)
columns.get(columnIndex);
// Instrument data
MXInstrument i = (MXInstrument) tmp;
switch (column) {
case LINE:
return i.getLine();
case TERM_TEXT:
return i.getTermText();
case TV_IDENTIFIER:
return i.getTvIdentifier();
case GROUP_NUMBER:
return
MXInstrument.GROUP_NUMBER_FOR_KEY_FORMAT.format(i
.getGroupNumber());
case MARKET:
return i.getMarket().getCode();
case SUPER_GROUP:
return i.getSuperGroupCode();
case COMPARING_TEXT:
return i.getComparingText();
case BUY_ORDERS:
return i.getBidsList();
case SELL_ORDERS:
return i.getOffersList();
}
return null;
}
@Override
public void actionPerformed(ActionEvent
arg0) {
newOrder(Order.Side.BID);
}
});
JMenuItem miNewOffer = new JMenuItem("New Offer");
miNewOffer.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent
arg0) {
newOrder(Order.Side.OFFER);
}
});
JMenuItem miNewBidOffer = new JMenuItem("New Bid &
Offer");
miNewBidOffer.addActionListener(new
ActionListener() {
@Override
public void actionPerformed(ActionEvent
arg0) {
newOrder(null);
}
});
JMenuItem miInstrumentDetail = new
JMenuItem("Instrument details");
miInstrumentDetail.addActionListener(new
ActionListener() {
@Override
public void actionPerformed(ActionEvent
arg0) {
instrumentDetails();
}
});
instrumentRightClickMenu.add(miInstrumentDetail);
miInstrumentDetail.setEnabled(false);
instrumentRightClickMenu.add(new
JPopupMenu.Separator());
instrumentRightClickMenu.add(miNewOffer);
instrumentRightClickMenu.add(miNewBid);
instrumentRightClickMenu.add(miNewBidOffer);
miNewBidOffer.setEnabled(false);
DefaultTableCellRenderer topAlignedCellRenderer =
new DefaultTableCellRenderer();
topAlignedCellRenderer.setVerticalAlignment(SwingConstant
s.TOP);
TableColumn column =
tblInstruments.getColumnModel().getColumn(0);
column.setWidth(30);
column.setPreferredWidth(30);
column.setMaxWidth(30);
column.setMinWidth(30);
column.setCellRenderer(topAlignedCellRenderer);
column =
tblInstruments.getColumnModel().getColumn(1);
int width2 = 100;
column.setWidth(width2);
column.setPreferredWidth(width2);
column.setMaxWidth(width2);
column.setMinWidth(width2);
column.setCellRenderer(topAlignedCellRenderer);
column =
tblInstruments.getColumnModel().getColumn(2);
column.setWidth(width2);
column.setPreferredWidth(width2);
column.setMaxWidth(width2);
column.setMinWidth(width2);
column.setCellRenderer(topAlignedCellRenderer);
OrdersTableModel.Column.REGISTRY_TYPE);
NestedTableCellRenderer ntcrBids = new
OrdersJTable(bidsModel);
ntcrBids.setColumAlignment(1,
SwingConstants.RIGHT);
ntcrBids.setColumAlignment(2,
SwingConstants.CENTER);
ntcrBids.setColumnWidth(2, 20);
column =
tblInstruments.getColumnModel().getColumn(BIDS_COLUMN);
column.setCellRenderer(ntcrBids);
setLayout(new BorderLayout());
add(scrollPane, BorderLayout.CENTER);
tblInstruments.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e) {
// System.out.println("" + e.getX() +
"," + e.getY());
TableColumnModel tcm =
tblInstruments.getColumnModel();
int column =
tcm.getColumnIndexAtX(e.getX());
int row =
tblInstruments.rowAtPoint(new Point(e.getX(), e
.getY()));
.getCellRenderer(row, column);
MouseEvent forwaredEvent =
(MouseEvent) SwingUtilities
.convertMouseEvent(tblInstruments, e,
tmp.getTable());
tmp.getTable().dispatchEvent(forwaredEvent);
// return;
if (e.getButton() !=
MouseEvent.BUTTON1) {
instrumentRightClickMenu.show(tblInstruments, e.getX(),
e.getY());
if (e.getClickCount() == 2) {
int selectedRow =
tblInstruments.getSelectedRow();
int selectedColumn =
tblInstruments.getSelectedColumn();
log.debug("double click [r,c]:
" + selectedRow + ","
+ selectedColumn);
if (selectedColumn ==
instrumentsOrdersModel
.getColumnIndex(InstrumentsTableModel.Column.LINE)) {
MXInstrument i =
(MXInstrument) instrumentsOrdersModel
.getObjectList().get(selectedRow);
log.debug("Instrument: "
+ i);
modifyOrder(e.getX(),
e.getY());
}
}
});
if (order != null) {
OrderFrame of = new OrderFrame(order);
of.setFixSession(fixSession);
of.setVisible(true);
}
}
protected void newOrder(MXOrder.Side side) { Metodo que permite
cambiar o asignar el orden
MXInstrument instrument = (MXInstrument)
instrumentsOrdersModel
de las columas.
.getObjectList().get(tblInstruments.getSelectedRow());
if (order != null
&& !order
.getMessage()
.getTag(CurrentOrderMessage.ORDER_PU_CODE)
.getStringValue()
.equals(fixSession.getDatatecFields()
.getPrimaryUserCode())) {
setTitle("Details");
txtAmount.setEditable(false);
txtBidRate.setEditable(false);
txtOfferRate.setEditable(false);
txtDrop.setEditable(false);
chkDripFeed.setEnabled(false);
txtGoodFor.setEditable(false);
btnOk.setVisible(false);
btnWithdraw.setVisible(false);
}
}
private OrderFrame() { Metodo donde se asigna formato, acción,
propiedades, atributos de los elementos
instrument = new MXInstrument();
que participa en el formulario, así mismo se
btnOffer = new JButton("Offer invoca a dos métodos uno de cancelado y
(sale)"); otro que permite llamar a un método de
btnOffer.addActionListener(new
ejecución de conexión entre datatec y el
ActionListener() {
cliente.
@Override
public void
actionPerformed(ActionEvent arg0) {
setSide(Order.Side.OFFER);
}
});
btnBid = new JButton("Bid
(purchase)");
btnBid.addActionListener(new
ActionListener() {
@Override
public void
actionPerformed(ActionEvent arg0) {
setSide(Order.Side.BID);
}
});
btnBidOffer = new JButton("Both");
btnBidOffer.addActionListener(new
ActionListener() {
@Override
public void
actionPerformed(ActionEvent arg0) {
setSide(null);
}
});
btnBidOffer.setEnabled(false);
@Override
public void
actionPerformed(ActionEvent e) {
doOk();
}
});
@Override
public void
actionPerformed(ActionEvent arg0) {
doCancel();
}
});
btnWithdraw = new
JButton("Withdraw");
btnWithdraw.addActionListener(new
ActionListener() {
@Override
public void
actionPerformed(ActionEvent arg0) {
doWithdraw();
}
});
buttonsDefaultColor =
btnOk.getBackground();
txtOfferRate.setHorizontalAlignment(JTextFi
eld.RIGHT);
txtBidRate = new JTextField(5);
txtBidRate.setHorizontalAlignment(JTextFiel
d.RIGHT);
txtAmount = new JTextField(5);
txtAmount.setHorizontalAlignment(JTextField
.RIGHT);
txtDrop = new JTextField(5);
txtDrop.setHorizontalAlignment(JTextField.R
IGHT);
txtGoodFor = new JTextField(5);
txtGoodFor.setHorizontalAlignment(JTextFiel
d.RIGHT);
@Override
public void
stateChanged(ChangeEvent arg0) {
doChkDripFeedChanged();
}
});
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor =
GridBagConstraints.LINE_START;
gbc.fill =
GridBagConstraints.HORIZONTAL;
pnlTmp.add(btnOffer, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridx =
GridBagConstraints.RELATIVE;
gbc.anchor =
GridBagConstraints.LINE_END;
pnlTmp.add(new JLabel("Instrument :
"), gbc);
gbc.anchor =
GridBagConstraints.LINE_START;
gbc.gridwidth = 2;
gbc.fill =
GridBagConstraints.HORIZONTAL;
pnlTmp.add(txtValueTitle, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridx = 0;
gbc.gridy++;
gbc.anchor =
GridBagConstraints.LINE_START;
gbc.fill =
GridBagConstraints.HORIZONTAL;
pnlTmp.add(btnBid, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridx =
GridBagConstraints.RELATIVE;
gbc.anchor =
GridBagConstraints.LINE_END;
gbc.gridx = 0;
gbc.gridy++;
gbc.anchor =
GridBagConstraints.LINE_START;
gbc.fill =
GridBagConstraints.HORIZONTAL;
pnlTmp.add(btnBidOffer, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridx =
GridBagConstraints.RELATIVE;
gbc.anchor =
GridBagConstraints.LINE_END;
pnlTmp.add(new JLabel("Term : "),
gbc);
gbc.anchor =
GridBagConstraints.LINE_START;
gbc.gridwidth = 2;
gbc.fill =
GridBagConstraints.HORIZONTAL;
pnlTmp.add(txtTerm, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridy++;
gbc.gridx = 1;
gbc.anchor =
GridBagConstraints.LINE_END;
pnlTmp.add(new JLabel("Liquidation :
"), gbc);
gbc.gridx =
GridBagConstraints.RELATIVE;
gbc.anchor =
GridBagConstraints.LINE_START;
gbc.gridwidth = 2;
gbc.fill =
GridBagConstraints.HORIZONTAL;
pnlTmp.add(txtLiquidation, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridy++;
gbc.gridx = 1;
gbc.anchor =
GridBagConstraints.LINE_END;
pnlTmp.add(new JLabel("Agreement :
"), gbc);
gbc.gridx =
GridBagConstraints.RELATIVE;
gbc.anchor =
GridBagConstraints.LINE_START;
gbc.gridwidth = 2;
gbc.fill =
GridBagConstraints.HORIZONTAL;
pnlTmp.add(txtAgreement, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridwidth = 1;
gbc.gridy++;
gbc.gridx = 0;
gbc.gridwidth = 2;
gbc.anchor =
GridBagConstraints.LINE_START;
pnlTmp.add(chkTypeOrder, gbc);
gbc.gridwidth = 1;
gbc.gridx =
GridBagConstraints.RELATIVE;
gbc.anchor =
GridBagConstraints.CENTER;
pnlTmp.add(new JLabel("Sale"), gbc);
pnlTmp.add(new JLabel("Purchase"),
gbc);
Dimension d = new Dimension(60, 10);
pnlTmp.add(new Box.Filler(d, d, d),
gbc);
gbc.gridwidth = 1;
gbc.gridy++;
gbc.gridx = 1;
gbc.anchor =
GridBagConstraints.LINE_END;
pnlTmp.add(new JLabel("Rate : "),
gbc);
gbc.gridx =
GridBagConstraints.RELATIVE;
gbc.anchor =
GridBagConstraints.LINE_START;
gbc.fill =
GridBagConstraints.HORIZONTAL;
pnlTmp.add(txtOfferRate, gbc);
pnlTmp.add(txtBidRate, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridy++;
gbc.gridx = 0;
gbc.anchor =
GridBagConstraints.LINE_START;
pnlTmp.add(chkDripFeed, gbc);
gbc.gridx =
GridBagConstraints.RELATIVE;
gbc.anchor =
GridBagConstraints.LINE_END;
pnlTmp.add(new JLabel("Amount : "),
gbc);
gbc.anchor =
GridBagConstraints.LINE_START;
gbc.fill =
GridBagConstraints.HORIZONTAL;
pnlTmp.add(txtAmount, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.anchor =
GridBagConstraints.LINE_END;
pnlTmp.add(lblDrop, gbc);
gbc.anchor =
GridBagConstraints.LINE_START;
gbc.fill =
GridBagConstraints.HORIZONTAL;
pnlTmp.add(txtDrop, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.gridy++;
gbc.gridx = 1;
gbc.anchor =
GridBagConstraints.LINE_END;
pnlTmp.add(new JLabel("Good for :
"), gbc);
gbc.gridx =
GridBagConstraints.RELATIVE;
gbc.anchor =
GridBagConstraints.LINE_START;
gbc.fill =
GridBagConstraints.HORIZONTAL;
pnlTmp.add(txtGoodFor, gbc);
setLayout(new BorderLayout());
add(pnlTmp, BorderLayout.CENTER);
pnlButtons.setBorder(BorderFactory.createMa
tteBorder(1, 0, 0, 0,
Color.LIGHT_GRAY));
pnlButtons.add(btnOk);
pnlButtons.add(btnWithdraw);
pnlButtons.add(btnCancel);
add(pnlButtons, BorderLayout.SOUTH);
pack();
setResizable(false);
doChkDripFeedChanged();
setSide(null);
pnlTmp.getInputMap(JComponent.WHEN_IN_FOCUS
ED_WINDOW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,
0), "escPressed");
pnlTmp.getActionMap().put("escPressed",
new
AbstractAction("escPressed") {
public void
actionPerformed(ActionEvent actionEvent) {
doCancel();
}
});
pnlTmp.getInputMap(JComponent.WHEN_IN_FOCUS
ED_WINDOW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,
0), "enterPressed");
pnlTmp.getActionMap().put("enterPressed",
new
AbstractAction("enterPressed") {
public void
actionPerformed(ActionEvent actionEvent) {
doOk();
}
});
}
protected void doWithdraw() { Método que genera un mensaje para él
envió de órdenes de transacción
try {
fixSession.sendTransactionOrderMessage(orde
r,
TransactionOrderMessage.Class.WITHDRAW);
dispose();
} catch (Exception e) {
JOptionPane.showMessageDialog(this,
"Error while
sending FIX message:\n" + e, "Error",
JOptionPane.ERROR_MESSAGE);
log.error("Error", e);
}
}
protected void doChkDripFeedChanged() { Método que asigna a los objetos el estado
visible o no
txtDrop.setVisible(chkDripFeed.isSelected()
);
lblDrop.setVisible(chkDripFeed.isSelected()
);
}
public OrderFrame(MXInstrument instrument) { Método que recibe un objeto de tipo
instrument y asigna el valor a cada campo
this();
this.instrument = instrument; dependiendo de los objetos que los
requiera
txtValueTitle.setText(instrument.getTvIdent
ifier());
txtGroupName.setText(instrument.getGroupNam
e());
txtTerm.setText(instrument.getTermText());
txtLiquidation.setText(instrument.getLiquid
ation());
txtAgreement.setText("" +
instrument.getAgreement());
btnWithdraw.setVisible(false);
}
public OrderFrame(MXOrder order) { Metodo que permite validar el contenido
de algunos campos como el precio, el
this(order.getInstrument());
this.order = order; monto para luego asignarlo a sus
respectivas cajas de texto previamente
setSide(order.getSide()); validado
if (order.getSide() ==
Order.Side.BID) {
txtBidRate.setText("" +
order.getPrice());
} else if (order.getSide() ==
Order.Side.OFFER) {
txtOfferRate.setText("" +
order.getPrice());
}
if (order.getTotalAmount() != 0
&&
order.getTotalAmount() > order.getAmount()) {
chkDripFeed.setSelected(true);
txtAmount.setText(AMOUNT_FORMAT.format(orde
r.getTotalAmount()));
txtDrop.setText(AMOUNT_FORMAT.format(order.
getAmount()));
} else {
chkDripFeed.setSelected(false);
txtAmount.setText(AMOUNT_FORMAT.format(orde
r.getAmount()));
}
if (order.getGoodFor() != 0) {
txtGoodFor.setText(AMOUNT_FORMAT.format(ord
er.getGoodFor()));
}
btnWithdraw.setVisible(true);
}
public void setSide(MXOrder.Side side) { Método que permite dar un formato de
presentación a los objetos que se
this.side = side;
String title = order == null ? encuentran contenidos en el formulario
"Enter" : "Modify";
if (side == null) {
txtBidRate.setEnabled(true);
txtOfferRate.setEnabled(true);
btnBidOffer.setBackground(Color.GREEN);
btnOffer.setBackground(buttonsDefaultColor)
;
btnBid.setBackground(buttonsDefaultColor);
txtOfferRate.setEnabled(false);
btnBidOffer.setBackground(buttonsDefaultCol
or);
btnOffer.setBackground(buttonsDefaultColor)
;
btnBid.setBackground(Color.ORANGE);
btnBidOffer.setBackground(buttonsDefaultCol
or);
btnOffer.setBackground(Color.BLUE);
btnBid.setBackground(buttonsDefaultColor);
setTitle(title);
}
if (side == null) {
if (offerRate == null ||
offerRate == 0) {
errorMessage += "-
Invalid Offer rate\n";
}
if (bidRate == null || bidRate
== 0) {
errorMessage += "-
Invalid Bid rate\n";
}
}
if (side == Order.Side.OFFER &&
(offerRate == null || offerRate == 0)) {
errorMessage += "- Invalid
Offer rate\n";
}
if (side == Order.Side.BID &&
(bidRate == null || bidRate == 0)) {
errorMessage += "- Invalid Bid
rate\n";
}
if (amount == null) {
errorMessage += "- Invalid
amount\n";
} else if (amount <
MXOrder.MIN_AMOUNT) {
errorMessage += "- Amount must
be >= " + MXOrder.MIN_AMOUNT;
}
if (chkDripFeed.isSelected() &&
amount != null
&& (drop == null ||
drop == 0 || drop > amount)) {
errorMessage += "- Invalid
drop\n";
}
if (goodFor != null && goodFor == 0)
{
goodFor = null;
}
if (!"".equals(errorMessage)) {
JOptionPane.showMessageDialog(this, "Check
the following errors:\n"
+ errorMessage,
"Error", JOptionPane.ERROR_MESSAGE);
return;
}
if (!chkDripFeed.isSelected()) {
order.setAmount(amount);
} else {
order.setAmount(drop);
order.setTotalAmount(amount);
}
order.setInstrument(instrument);
order.setSide(side);
if (goodFor != null) {
order.setGoodFor(goodFor);
}
if (side == Order.Side.BID) {
order.setPrice(bidRate);
} else if (side == Order.Side.OFFER)
{
order.setPrice(offerRate);
}
try {
fixSession.sendTransactionOrderMessage(order,
TransactionOrderMessage.Class.ENTER);
dispose();
} catch (Exception e) {
JOptionPane.showMessageDialog(this,
"Error while
sending FIX message:\n" + e, "Error",
JOptionPane.ERROR_MESSAGE);
log.error("Error", e);
}
protected void doCancel() { Metodos que permite cancelar una acción u
dispose();
operación
}
c.setForeground(Color.BLACK);
}
return c;
}
}
//
System.out.println("Inner table");
//
System.out.println("" + e.getX() + ", " +
e.getY());
}
});
}
@Override
public String getTitle() {
return null;
}
@Override
public Class<?> getType() {
if (this == AMOUNT) {
return Double.class;
}
return String.class;
}
}
public OrdersTableModel(Column... columns) { Metodo que hereda el objeto columns
super(columns);
}
public Object getValueAt(int rowIndex, int Metodo que permite el valor de una celda
columnIndex) {
especificando la fila y columna el cual serán
if (rowIndex < getRowCount() && columnIndex <
getColumnCount()) { pasado como argumento con el fin de
MXOrder order = (MXOrder) formatear y validar el datos asignado al
objectList.get(rowIndex); Jtable
Column = (Column) columns.get(columnIndex);
switch (column) {
case AMOUNT:
return order.getAmount();
case RATE:
return
Order.RATE_FORMAT.format(order.getPrice());
case CODE:
return order.getCode();
case KEY:
return order.getKey();
case REGISTRY_TYPE:
return
order.getRegistryTypeFlag();
}
}
return null;
}
8. com.datatec.fix.mx:
.getTag(MXFixedIncomeInstrumentMessage.UNIQUE_CODE
).getValue()
.toString());
inst.setGroupCode(msg.getTag(MXFixedIncomeInstrume
ntMessage.GROUP_CODE)
.getValue().toString());
if
(msg.getTag(MXFixedIncomeInstrumentMessage.GROUP_NUMBER)
!= null) {
String grpNumber = msg
.getTag(MXFixedIncomeInstrumentMessage.GROUP_NUMBE
R)
.getValue().toString();
inst.setGroupNumber(Integer.parseInt(grpNumber));
}
inst.setSuperGroupCode(msg
.getTag(MXFixedIncomeInstrumentMessage.SUPER_GROUP
_CODE)
.getValue().toString());
inst.setMatchingText(msg
.getTag(MXFixedIncomeInstrumentMessage.MATCHING_TE
XT)
.getValue().toString());
if
(msg.getTag(MXFixedIncomeInstrumentMessage.MIN_LINE) !=
null) {
String strMinLine = msg
.getTag(MXFixedIncomeInstrumentMessage.MIN_LINE).g
etValue()
.toString();
inst.setMinimumLine(Integer.parseInt(strMinLine));
}
inst.setTermText(msg.getTag(MXFixedIncomeInstrumen
tMessage.TERM_TEXT)
.getValue().toString());
inst.setTvIdentifier(msg.getTag(MXFixedIncomeInstr
umentMessage.TV)
.getValue().toString());
inst.setGroupName(msg.getTag(MXFixedIncomeInstrume
ntMessage.GROUP_NAME)
.getValue().toString());
try {
inst.setLiquidation(msg
.getTag(MXFixedIncomeInstrumentMessage.LIQUIDATION
)
.getValue().toString());
} catch (Exception e) {
// TODO: handle exception
log.error(e);
}
// FIXME
if
(msg.getTag(MXFixedIncomeInstrumentMessage.AGREEMENT) !=
null) {
Integer agreement = new Integer(msg
.getTag(MXFixedIncomeInstrumentMessage.AGREEMENT)
.getValue().toString());
inst.setAgreement(MXInstrument.Agreement.values()[
agreement]);
} else {
inst.setAgreement(MXInstrument.Agreement.FIRM_ORDE
R);
}
try {
inst.setValueDate(msg.getTag(
MXFixedIncomeInstrumentMessage.VALUE_DATE)
.getIntegerValue());
} catch (Exception e) {
log.error(e);
}
inst.setxDays(msg.getTag(MXFixedIncomeInstrumentMe
ssage.XDAYS)
.getIntegerValue());
inst.setCurrency(msg.getTag(MXFixedIncomeInstrumen
tMessage.CURRENCY)
.getValue().toString());
inst.setTitleReference(msg
.getTag(MXFixedIncomeInstrumentMessage.TITLE_REFER
ENCE)
.getValue().toString());
char flag =
msg.getTag(MXFixedIncomeInstrumentMessage.OPERATION_FLAG)
.getValue().toString().charAt(0);
switch (flag) {
case 'I':
case 'M':
instruments.put(inst.getKey(), inst);
break;
case 'B':
instruments.remove(inst.getKey());
break;
}
// reasign lines
if (instruments != null &&
instruments.size() != 0) {
int lastMinLine = 0;
int line = 1;
for (Instrument instrument :
instruments.values()) {
MXInstrument mxInstrument =
(MXInstrument) instrument;
if (lastMinLine !=
mxInstrument.getMinimumLine()) {
lastMinLine =
mxInstrument.getMinimumLine();
line = lastMinLine;
}
mxInstrument.setLine(line);
line++;
if (mxInstrument.getLine() ==
1) {
}
}
ml.processInstrumentDataReceived(instruments,
inst);
}
}
protected void receiveCurrentOrderData(Message msg) { Metodo que recibe los datos de la
orden de dato actual, asigna los
log.debug("Current Order received");
valores de las variables privadas
Tag market = finales a los campos del tag market,
msg.getTag(CurrentOrderMessage.MARKET); genera un registro log de los valores
Tag superGroupCode =
de los tag asignados, así mismo
msg.getTag(CurrentOrderMessage.SUPER_GROUP_CODE);
Tag groupNumber = registra los valores de los tag
msg.getTag(CurrentOrderMessage.GROUP_NUMBER); perteneciente instrument
Tag comparingText = igualmente generándole un registro
msg.getTag(CurrentOrderMessage.MATCHING_TEXT);
log y realizando la acción de
Tag bidOffer =
msg.getTag(CurrentOrderMessage.BID_OR_OFFER); eliminar o actualizar según el valor
del flag de operación.
log.debug("Market=" +
market.getValue().toString());
log.debug("Super Group code=" +
superGroupCode.getValue().toString());
log.debug("Group number=" +
groupNumber.getValue().toString());
log.debug("Comparing text=" +
comparingText.getValue().toString());
groupNumber.getValue().toString()))
+
comparingText.getValue().toString();
if (instrument != null) {
Tag price =
msg.getTag(CurrentOrderMessage.PRICE);
Tag amount =
msg.getTag(CurrentOrderMessage.NUMBER);
Tag totalAmount =
msg.getTag(CurrentOrderMessage.TOTAL_NUMBER);
Tag code =
msg.getTag(CurrentOrderMessage.ORDER_CODE);
Tag operationFlag =
msg.getTag(CurrentOrderMessage.OPERATION_FLAG);
Tag registryType = msg
.getTag(CurrentOrderMessage.REGISTRY_TYPE_FLAG);
log.debug("Bid/Offer=" +
bidOffer.getValue());
log.debug("Code=" +
code.getValue().toString());
log.debug("Registry type=" +
registryType.getValue().toString());
log.debug("Operation flag=" +
operationFlag.getValue().toString());
registryType.getValue().toString().charAt(0),
price.getDoubleValue(),
amount.getDoubleValue(),
totalAmount != null ?
totalAmount.getDoubleValue() : 0);
order.setMessage(msg);
log.debug("Order key=" +
order.getKey());
log.debug("Amount=" +
order.getAmount());
log.debug("Price=" +
order.getPrice());
switch
(operationFlag.getValue().toString().charAt(0)) {
case 'I':
case 'M':
instrument.updateOrder(order);
break;
case 'B':
instrument.removeOrder(order);
break;
}
}
ml.processCurrentOrderDataReceived(instrument,
order);
}
}
sendMessage(toMessage);
return agreement;
}
this.agreement = agreement;
}
return groupName;
}
this.groupName = groupName;
}
public Market getMarket() {
return market;
}
this.market = market;
}
return uniqueCode;
}
this.uniqueCode = uniqueCode;
}
return groupCode;
}
public void setGroupCode(String groupCode)
{
this.groupCode = groupCode;
}
return superGroupCode;
}
public void setSuperGroupCode(String
superGroupCode) {
this.superGroupCode =
superGroupCode;
}
return comparingText;
}
public int getMinimumLine() {
return minimumLine;
}
this.minimumLine = minimumLine;
}
return titleReference;
}
this.titleReference =
titleReference;
}
return tvIdentifier;
}
this.tvIdentifier = tvIdentifier;
}
return groupNumber;
}
public void setGroupNumber(int groupNumber)
{
this.groupNumber = groupNumber;
}
return line;
}
this.line = line;
}
public int getValueDate() {
return valueDate;
}
this.valueDate = valueDate;
}
return xDays;
}
this.xDays = xDays;
}
return currency;
}
this.currency = currency;
}
public MXOrder(MXInstrument instrument, Side, Constructor que hace referencia a una clase
String code,
padre y le envía parámetros , así mismo
char registryTypeFlag, double
rate, double amount, almacena los valores como instrumento un
double totalAmount) { tipo de registro flag
super(instrument.getMarket(), side,
code, rate, amount, totalAmount);
this.instrument = instrument;
this.registryTypeFlag =
registryTypeFlag;
}
public MXInstrument getInstrument() { Método get y set de las estructura
return instrument;
Instrument
}
public void setInstrument(MXInstrument
instrument) {
this.instrument = instrument;
}
public String getKey() { Método para generar código, el Código de
return getMarket().getCode() + registryTypeFlag +
pedido Se utiliza con el "indicador de tipo de
code;
} registro" y el mercado para crear un
identificador único del pedido
public int compareTo(MXOrder o) { Método que permite comparar el valor de la
int c = super.compareTo(o);
variebles finales constantes con el valor del
if (c == 0) {
if (this.registryTypeFlag == tipo de registro flag y retorna un valor entero
REGISTRY_TYPE_BEST_PRICE_ACCUMULATED como resultado de la comparación
&& o.registryTypeFlag !=
REGISTRY_TYPE_BEST_PRICE_ACCUMULATED) {
return -1;
} else if
(this.registryTypeFlag !=
REGISTRY_TYPE_BEST_PRICE_ACCUMULATED
&& o.registryTypeFlag
== REGISTRY_TYPE_BEST_PRICE_ACCUMULATED) {
return 1;
}
c = code.compareTo(o.code);
}
return c;
}
public Market getMarket() { Metodo para obtener los valores del
if (instrument == null) {
Mercado y el registro de tipo Flag
return null;
}
return instrument.getMarket();
}
return registryTypeFlag;
}
this.registryTypeFlag =
registryTypeFlag;
}
addTag(new Tag(PRICE,
order.getPrice()));
addTag(new Tag(NUMBER,
AMOUNT_FORMAT.format(order.getAmount())));
// setTag(new Tag(MIN_NUMBER,
AMOUNT_FORMAT.format(order.getAmount())));
// Drop (Iceberg) orders
if (order.getTotalAmount() > 0
&&
order.getTotalAmount() > order.getAmount()) {
addTag(new Tag(TOTAL_NUMBER,
AMOUNT_FORMAT.format(order
.getTotalAmount())));
}
addTag(new Tag(CURRENCY,
instrument.getCurrency()));
addTag(new Tag(GROUP_CODE,
instrument.getGroupCode()));
addTag(new Tag(LIQUIDATION,
instrument.getLiquidation()));
addTag(new
Tag(FI_INSTRUMENT_IDENTIFIER,
instrument.getTitleReference()));
if (order.getGoodFor() > 0) {
addTag(new
Tag(LIQUIDATION_NUMBER, order.getGoodFor()));
}
.getTag(CurrentOrderMessage.ORDER_CODE).get
Value()));
}
9. com.datatec.gui
doOk();
}
});
btnCancel = new JButton("Cancel");
btnCancel.addActionListener(new ActionListener() {
doCancel();
}
});
pnlBotones.setBorder(BorderFactory.createMatteBorder(1,
0, 0, 0,
Color.LIGHT_GRAY));
pnlBotones.add(btnOk);
pnlBotones.add(btnCancel);
add(pnlBotones, BorderLayout.SOUTH);
agregarActionEnter(pnlBotones);
}
public void
actionPerformed(ActionEvent actionEvent) {
doOk();
}
});
}
showMessage(otm.getObjectList().get(translatedRow));
}
protected void showMessage(Object msgContainer) { Método que permite
mostrar un mensaje dentro
MessageFrame msgFrame = null;
if (msgContainer instanceof Message) { de un objeto frame
msgFrame = new MessageFrame((Message)
msgContainer);
} else if (msgContainer instanceof
MessageContainer) {
msgFrame = new
MessageFrame((MessageContainer) msgContainer);
}
if (msgFrame != null) {
Point p = this.getLocation();
msgFrame.setLocation(p.x + 60, p.y + 60);
msgFrame.setVisible(true);
}
// Order data
Order = (Order) tmp;
switch (column) {
case INSTITUTION_CODE:
return order.getInstitutionCode();
case AMOUNT:
return order.getAmount();
case PRICE:
case RATE:
return order.getPrice();
case MATURITY_DATE:
if (order.getMaturityDate() != null) {
return
MATURITY_DATE_FORMAT.format(order.getMaturityDate());
}
break;
case DAYS:
return order.getDays();
case VALUE_DATE_CDBCR:
case VALUE_DATE_FI:
return order.getValueDateCDBCR();
case YIELD_CDBCR:
return order.getYieldCDBCR();
case PRICE_PCT_FI:
return order.getPricePercentageFI();
case YIELD_PCT_FI:
return order.getPrice();
}
return null;
}
if (row % 2 == 0 &&
!isCellSelected(row, col)) {
c.setBackground(backgroundColor);
// cell is selected, use the
highlight color
} else if (isCellSelected(row, col)) {
c.setBackground(getSelectionBackground());
} else {
c.setBackground(getBackground());
}
}
return c;
}
public TableColumn getColumn(Object arg0) { Metodo que se define para
obtener el valor de una columna
if (simpleTableModel != null) {
return getColumnModel() del JTable
.getColumn(
simpleTableModel
.getColumnIndex((com.datatec.gui.DatatecTableColumn)
arg0));
}
return super.getColumn(arg0);
}
private Column() {
this.title = name();
this.type = String.class;
}
this.title = title;
this.type = type;
}
@Override
public String getTitle() {
return title;
}
@Override
public Class<?> getType() {
return type;
}
}
public StatisticsTableModel(Column... columns) { Metodo que hereda los dasos de las
super(columns);
columnas
}
public Object getValueAt(int rowIndex, int Metodo que obtene el valor de una
columnIndex) {
celda tomando como valor la fila y la
if (rowIndex >= objectList.size() || columna la cual se ha seleccionado. Se
columnIndex > titles.length) { obtine los valores de la celda para
return null; realizar operaciones de cálculos y
}
validaciones, se muestra datos de la
Object tmp = objectList.get(rowIndex); JTable estadicticas.
Column = (Column)
columns.get(columnIndex);
// Statistics data
StatisticData statistics =
(StatisticData) tmp;
switch (column) {
case TIME:
return
TIME_FORMAT.format(statistics.getDateTime());
case PRICE:
return statistics.getPrice();
case TRADED_NUMBER:
return
statistics.getTradedNumber();
case REGISTERED_FLAG:
if (statistics.getRegisterFlag() !=
null) {
return
statistics.getRegisterFlag().getCode();
}
break;
case DAYS:
return statistics.getDays();
case MATURITY_DATE:
if (statistics.getMaturityDate() !=
null) {
return MATURITY_DATE_FORMAT
.format(statistics.getMaturityDate());
}
break;
case BOND_IDENTIFIER:
if (statistics.getBondIdentifier()
!= null) {
return
statistics.getBondIdentifier();
}
break;
case VALUE_DATE:
return statistics.getValueDate();
case EFFECTIVE_MONTHLY_YIELD_RATE:
return
statistics.getEffectiveMontlhyYieldRate();
case TITLE_CODE:
return statistics.getTitleCode();
case EMITTER_CODE:
return statistics.getEmitterCode();
case CURRENCY:
return statistics.getCurrency();
case EMISSION_DATE:
if (statistics.getEmissionDate() !=
null) {
return MATURITY_DATE_FORMAT
.format(statistics.getEmissionDate());
}
break;
case YIELD_RATE:
return statistics.getYieldRate();
default:
break;
}
return null;
}