Thursday, October 15, 2020

Java Basic Util - Scaffold

 1 Exception scaffold to run business and convert all exception to BusinessException.


package basic.util.scaffold;


import basic.util.exception.BaseException;

import basic.util.exception.BusinessException;

import basic.util.function.IAction;


public class ExceptionContext {


public static void runOrThrowBusinessException(IAction action, String function) {

try {

action.run();

} catch (Exception exception) {

BusinessException.throwException(BaseException.Failed, BusinessException.ExceptionFailed, exception, function);

}

}

}

2 Transaction scaffold to run business in transaction or XA transaction.

package basic.util.scaffold;

import basic.util.function.IAction;
import basic.util.orm.EntityContext;
import basic.util.orm.EntityOperation;
import basic.util.orm.XAContext;

public class TransactionContext {

public static void runInTransaction(EntityContext entityContext, IAction action) {
try {
entityContext.beginTransaction();
action.run();
entityContext.commitTransaction();
} catch (Exception exception) {
entityContext.rollbackTransaction();
throw exception;
}
}
public static void runInXATransaction(IAction action) {
try {
XAContext.beginXA();
action.run();
XAContext.commitXA();
} catch (Exception exception) {
XAContext.rollbackXA();
throw exception;
}
}
public static void main(String[] args) {
TransactionContext transactionContext = new TransactionContext();
testCommit(transactionContext);
testRollback(transactionContext);

testXACommit(transactionContext);
testXARollback(transactionContext);
}

private static void testXACommit(TransactionContext transactionContext) {
EntityContext entityContext = new EntityContext("mssql");
EntityOperation operation = entityContext.getEntityOperation();
//entityContext.monitor(true);
EntityContext entityContext2 = new EntityContext("mssql2");
EntityOperation operation2 = entityContext2.getEntityOperation();
//entityContext2.monitor(true);
IAction action = () -> {
DataModel data = new DataModel();
data.setCode(1);
data.setValue("test code 1");
operation.add(data);
operation2.add(data);
data.setValue("test code 11");
operation.update(data);
operation2.update(data);
};
runInXATransaction(action);
operation.selectOne(DataModel.class, 1).ifPresent(object -> {
DataModel model = (DataModel) object;
System.out.println(model.getValue());
});
operation2.selectOne(DataModel.class, 1).ifPresent(object -> {
DataModel model = (DataModel) object;
System.out.println(model.getValue());
});
}
private static void testXARollback(TransactionContext transactionContext) {
EntityContext entityContext = new EntityContext("mssql");
EntityOperation operation = entityContext.getEntityOperation();
//entityContext.monitor(true);
EntityContext entityContext2 = new EntityContext("mssql2");
EntityOperation operation2 = entityContext2.getEntityOperation();
//entityContext2.monitor(true);
DataModel data = new DataModel();
data.setCode(1);
data.setValue("test code 1");
IAction action = () -> {
operation.delete(DataModel.class, data.getCode());
throw new RuntimeException("test exception");
};

try {
ExceptionContext.runOrThrowBusinessException(()->runInTransaction(entityContext, action), "testRollback");;
} catch (Exception exception) {
System.out.println(exception.getLocalizedMessage());
}
IAction action2 = () -> {
operation2.delete(DataModel.class, data.getCode());
throw new RuntimeException("test exception");
};

try {
ExceptionContext.runOrThrowBusinessException(()->runInTransaction(entityContext2, action2), "testRollback");;
} catch (Exception exception) {
System.out.println(exception.getLocalizedMessage());
}
operation.selectOne(DataModel.class, 1).ifPresent(object -> {
DataModel model = (DataModel) object;
System.out.println(model.getValue());
});
operation2.selectOne(DataModel.class, 1).ifPresent(object -> {
DataModel model = (DataModel) object;
System.out.println(model.getValue());
});
operation.delete(DataModel.class, data.getCode());
operation2.delete(DataModel.class, data.getCode());
}
private static void testCommit(TransactionContext transactionContext) {
EntityContext entityContext = new EntityContext("mssql");
EntityOperation operation = entityContext.getEntityOperation();
//entityContext.monitor(true);
IAction action = () -> {
DataModel data = new DataModel();
data.setCode(1);
data.setValue("test code 1");
operation.add(data);
data.setValue("test code 11");
operation.update(data);
};
runInTransaction(entityContext, action);
operation.selectOne(DataModel.class, 1).ifPresent(object -> {
DataModel model = (DataModel) object;
System.out.println(model.getValue());
});
}
private static void testRollback(TransactionContext transactionContext) {
EntityContext entityContext = new EntityContext("mssql");
EntityOperation operation = entityContext.getEntityOperation();
//entityContext.monitor(true);
DataModel data = new DataModel();
data.setCode(1);
data.setValue("test code 1");
IAction action = () -> {
operation.delete(DataModel.class, data.getCode());
throw new RuntimeException("test exception");
};

try {
ExceptionContext.runOrThrowBusinessException(()->runInTransaction(entityContext, action), "testRollback");;
} catch (Exception exception) {
System.out.println(exception.getLocalizedMessage());
}
operation.selectOne(DataModel.class, 1).ifPresent(object -> {
DataModel model = (DataModel) object;
System.out.println(model.getValue());
});
operation.delete(DataModel.class, data.getCode());
}
}

3 This is the value object used in test case.

package basic.util.scaffold;

import basic.util.orm.annotation.Column;
import basic.util.orm.annotation.Key;
import basic.util.orm.annotation.Table;

@Table(tableName="Test")
public class DataModel {
@Key(autoIncrement = Key.AutoIncrement.FALSE,column = @Column(columnName = "code")) 
private int code;
@Column(columnName = "value") 
private String value;
public int getCode() {
return code;
}

public void setCode(int code) {
this.code = code;
}
public String getValue() {
return value;
}

public void setValue(String value) {
this.value = value;
}
}

No comments:

Post a Comment