Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
174 changes: 110 additions & 64 deletions src/main/java/net/sf/cb2java/Settings.java
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -23,33 +23,23 @@
import java.util.Properties;
import net.sf.cb2java.types.SignPosition;

public interface Settings {
static Settings DEFAULT = new Default();

String getEncoding();

Values getValues();

boolean getLittleEndian();

String getFloatConversion();

SignPosition getSignPosition();

int getColumnStart();

int getColumnEnd();

static class Default implements Settings {
private static final String DEFAULT_ENCODING;
private static final boolean DEFAULT_LITTLE_ENDIAN;
private static final String DEFAULT_FLOAT_CONVERSION;
private static final SignPosition DEFAULT_SIGN_POSITION;
private static final Values DEFAULT_VALUES = new Values();
private static final int DEFAULT_COLUMN_START;
private static final int DEFAULT_COLUMN_END;

static {
public class Settings {

String encoding = System.getProperty("file.encoding");
boolean littleEndian = false;
String floatConversion = "net.sf.cb2java.copybook.floating.IEEE754";
SignPosition signPosition = SignPosition.TRAILING;
int columnStart = 6;
int columnEnd = 72;
Values values = new Values();
boolean resiliant = false;
boolean trimStrings = false;
String EBCDICVariant = "";

static Settings DEFAULT;
static public Settings DEFAULT() {
if(DEFAULT == null) {
DEFAULT = new Settings();
Properties props = new Properties();

try (InputStream is = Settings.class.getResourceAsStream("/copybook.props")) {
Expand All @@ -63,52 +53,108 @@ static class Default implements Settings {
System.out.println("Could not load 'copybook.props' file, reverting to defaults.");
}

DEFAULT_ENCODING = getSetting("encoding", System.getProperty("file.encoding"), props);
DEFAULT_LITTLE_ENDIAN = "false".equals(getSetting("little-endian", "false", props));
DEFAULT_FLOAT_CONVERSION = getSetting("float-conversion", "net.sf.cb2java.copybook.floating.IEEE754",
props);
DEFAULT_SIGN_POSITION = "leading".equalsIgnoreCase(getSetting("default-sign-position", "trailing", props))
? SignPosition.LEADING : SignPosition.TRAILING;
DEFAULT_COLUMN_START = Integer.parseInt(getSetting("column.start", "6", props));
DEFAULT_COLUMN_END = Integer.parseInt(getSetting("column.end", "72", props));
DEFAULT.setEncoding(getSetting("encoding", DEFAULT.getEncoding(), props));
DEFAULT.setLittleEndian("false".equals(getSetting("little-endian", DEFAULT.isLittleEndian() + "", props)));
DEFAULT.setFloatConversion(getSetting("float-conversion", DEFAULT.getFloatConversion(), props));
DEFAULT.setSignPosition("leading".equalsIgnoreCase(getSetting("default-sign-position", "trailing", props))
? SignPosition.LEADING : SignPosition.TRAILING);
DEFAULT.setColumnStart(Integer.parseInt(getSetting("column.start", DEFAULT.getColumnStart() + "", props)));
DEFAULT.setColumnEnd(Integer.parseInt(getSetting("column.end", DEFAULT.getColumnEnd() + "", props)));
DEFAULT.setResiliant("false".equals(getSetting("resilient", DEFAULT.isResiliant() + "", props)));
DEFAULT.setTrimStrings("true".equals(getSetting("trim", DEFAULT.getTrimStrings() + "", props)));
DEFAULT.setEBCDICVariant(getSetting("EBCDIC-variant", DEFAULT.getEBCDICVariant(), props));
}
return DEFAULT;
}

private static String getSetting(String name, String defaultValue, Properties props) {
String result = defaultValue;
try {
result = System.getProperty("cb2java." + name, result);
result = props.getProperty(name, result);
} catch (RuntimeException e) {
}
return result;
}
public String getEncoding() {
return encoding;
}

public String getEncoding() {
return DEFAULT_ENCODING;
}
public void setEncoding(String encoding) {
this.encoding = encoding;
}

public String getFloatConversion() {
return DEFAULT_FLOAT_CONVERSION;
}
public boolean isLittleEndian() {
return littleEndian;
}

public boolean getLittleEndian() {
return DEFAULT_LITTLE_ENDIAN;
}
public void setLittleEndian(boolean littleEndian) {
this.littleEndian = littleEndian;
}

public Values getValues() {
return DEFAULT_VALUES;
}
public String getFloatConversion() {
return floatConversion;
}

public SignPosition getSignPosition() {
return DEFAULT_SIGN_POSITION;
}
public void setFloatConversion(String floatConversion) {
this.floatConversion = floatConversion;
}

public SignPosition getSignPosition() {
return signPosition;
}

public void setSignPosition(SignPosition signPosition) {
this.signPosition = signPosition;
}

public int getColumnStart() {
return columnStart;
}

public void setColumnStart(int columnStart) {
this.columnStart = columnStart;
}

public int getColumnEnd() {
return columnEnd;
}

public void setColumnEnd(int columnEnd) {
this.columnEnd = columnEnd;
}

public Values getValues() {
return values;
}

public void setValues(Values values) {
this.values = values;
}

public boolean isResiliant() {
return resiliant;
}

public void setResiliant(boolean resiliant) {
this.resiliant = resiliant;
}

public boolean getTrimStrings() {
return trimStrings;
}

public void setTrimStrings(boolean trimStrings) {
this.trimStrings = trimStrings;
}

public String getEBCDICVariant() {
return EBCDICVariant;
}

public void setEBCDICVariant(String EBCDICVariant) {
this.EBCDICVariant = EBCDICVariant;
}

public int getColumnStart() {
return DEFAULT_COLUMN_START;
}

public int getColumnEnd() {
return DEFAULT_COLUMN_END;
static private String getSetting(String name, String defaultValue, Properties props) {
String result = defaultValue;
try {
result = System.getProperty("cb2java." + name, result);
result = props.getProperty(name, result);
} catch (RuntimeException e) {
}
return result;
}
}
6 changes: 3 additions & 3 deletions src/main/java/net/sf/cb2java/copybook/CobolPreprocessor.java
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@ public class CobolPreprocessor {
private CobolPreprocessor() {
}

public static String preProcess(Reader reader) {
public static String preProcess(Reader reader, Settings settings) {
// TODO: figure out a way to pass copybook specific settings for non-default margins treated as comment.
int columnStart = Settings.DEFAULT.getColumnStart();
int columnEnd = Settings.DEFAULT.getColumnEnd();
int columnStart = settings.getColumnStart();
int columnEnd = settings.getColumnEnd();

StringBuffer sb = new StringBuffer();

Expand Down
73 changes: 4 additions & 69 deletions src/main/java/net/sf/cb2java/copybook/Copybook.java
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,8 @@
*
* @author James Watson
*/
public class Copybook extends Group implements Settings
public class Copybook extends Group //implements Settings
{
private String encoding = Settings.DEFAULT.getEncoding();
private boolean littleEndian = Settings.DEFAULT.getLittleEndian();
private String floatConversion = Settings.DEFAULT.getFloatConversion();
private SignPosition signPosition = Settings.DEFAULT.getSignPosition();

private Map<String, Element> redefines = new HashMap<String, Element>();

private final Values values;
Expand All @@ -56,12 +51,13 @@ public class Copybook extends Group implements Settings
*
* @param name the name of the copybook
*/
Copybook(String name, Values values)
Copybook(String name, Values values, Settings settings)
{
super(name, 0, 0);

this.values = values;
this.values.setEncoding(encoding);
this.setSettings(settings);
this.values.setEncoding(settings.getEncoding());
}

public Values getValues()
Expand Down Expand Up @@ -126,67 +122,6 @@ public List<Record> parseData(InputStream stream) throws IOException

return list;
}

/**
* Sets the encoding for the copybook instance, used for parsing
* and writing of data
*
* @param encoding the encoding for the system
*/
public void setEncoding(String encoding)
{
this.encoding = encoding;
}

/**
* retrieves the current encoding for text
*
* @return the encoding for text
*/
public String getEncoding()
{
return encoding;
}

public void setLittleEndian(boolean littleEndian)
{
this.littleEndian = littleEndian;
}

public boolean getLittleEndian()
{
return littleEndian;
}

public void setFloatConversion(String className)
{
this.floatConversion = className;
}

public String getFloatConversion()
{
return floatConversion;
}

public void setSignPosition(SignPosition position)
{
this.signPosition = position;
}

public SignPosition getSignPosition()
{
return signPosition;
}

@Override
public int getColumnStart() {
return Settings.DEFAULT.getColumnStart();
}

@Override
public int getColumnEnd() {
return Settings.DEFAULT.getColumnEnd();
}

/**
* a helper class for buffering the data as it is processed
Expand Down
15 changes: 9 additions & 6 deletions src/main/java/net/sf/cb2java/copybook/CopybookAnalyzer.java
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.util.List;
import java.util.StringTokenizer;

import net.sf.cb2java.Settings;
import net.sf.cb2java.Values;
import net.sf.cb2java.types.Element;
import net.sf.cb2java.types.Group;
Expand Down Expand Up @@ -84,6 +85,7 @@ class CopybookAnalyzer extends DepthFirstAdapter
private Parser parser;
private Item document;
private Item current;
private Settings settings;

/**
* Creates a new instance with the given parser and
Expand All @@ -92,12 +94,13 @@ class CopybookAnalyzer extends DepthFirstAdapter
* @param copyBookName the name to give this copybook
* @param parser sablecc parser instance
*/
CopybookAnalyzer(String copyBookName, Parser parser)
CopybookAnalyzer(String copyBookName, Parser parser, Settings settings)
{
document = new Item(values, true);
document = new Item(values, true, settings);
document.name = copyBookName;
current = document;
this.parser = parser;
this.settings = settings;
}

/**
Expand Down Expand Up @@ -127,7 +130,7 @@ public void outARecordDescription(ARecordDescription node)

private void walkTree(Item item)
{
item.getElement().setSettings((Copybook) document.getElement());
item.getElement().setSettings(document.getElement().getSettings());

for (Iterator<?> i = item.children.iterator(); i.hasNext();) {
Item child = (Item) i.next();
Expand Down Expand Up @@ -176,7 +179,7 @@ public void checkForComments(Token node)
public void inAItem(AItem node)
{
Item prevItem = current;
current = new Item(values, false);
current = new Item(values, false, settings);
current.level = Integer.parseInt(node.getNumberNot88().toString().trim());
current.name = node.getDataNameOrFiller().toString().trim();

Expand Down Expand Up @@ -265,12 +268,12 @@ public void inASignClause(ASignClause node)

public void inALeadingLeadingOrTrailing(ALeadingLeadingOrTrailing node)
{
current.signPosition = SignPosition.LEADING;
current.getSettings().setSignPosition(SignPosition.LEADING);
}

public void inATrailimngLeadingOrTrailing(ALeadingLeadingOrTrailing node)
{
current.signPosition = SignPosition.TRAILING;
current.getSettings().setSignPosition(SignPosition.TRAILING);
}

//======================= USAGE CLAUSE ==========================
Expand Down
Loading