--- FM2SQL/src/Convert.java 2005/03/21 10:32:03 1.5 +++ FM2SQL/src/Convert.java 2006/09/30 10:58:58 1.16 @@ -29,8 +29,10 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; +import java.text.DateFormat; import java.text.ParseException; import java.util.ArrayList; +import java.util.Date; import java.util.Hashtable; import java.util.Iterator; import java.util.List; @@ -47,6 +49,8 @@ import com.exploringxml.xml.Xparse; class Convert { + private static final String _TEMP = "_temp"; + /** * Helper class for index creation * @@ -93,9 +97,13 @@ class Convert public void executeCommand() throws SQLException, Exception { + System.out.println("Executing command: \n"); + System.out.println(command); + java.sql.Connection con = bean.getConnection(); Statement stm = con.createStatement(); stm.execute(command); + stm.close(); } } @@ -129,8 +137,16 @@ class Convert static Vector postSQLCommands = new Vector(); + static final String versionID = new String("FM2SQL Version 0.9.10b\n"); + + private static boolean noError = false; + public static void main(String args[]) throws IOException { + // DateFormat d = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, + // Locale.GERMANY); + // System.out.println(convertText("rogoistSuper" + "_" + d.format(new Date()).replace(':', '_'))); + /* * try { //byte[] b = "�".getBytes("UTF-8"); // * System.out.println("QueryString " +b[0]+" "+b[1]+(new @@ -138,32 +154,50 @@ class Convert * //System.out.println(new String(b,"UTF-8")); } catch * (UnsupportedEncodingException e) { e.printStackTrace(); } */ + File tmpPath = new File(System.getProperty("java.io.tmpdir")); isGUI = false; FileOutputStream file = null; if (args.length != 1) { + System.out.println(versionID); System.out.println("Usage: java Convert "); System.exit(-1); } + File temp = null; try { - File temp = File.createTempFile("fm2sql", ".txt"); + temp = new File(tmpPath, "fm2sql.txt"); + int count = 1; + while (temp.exists()) + { + temp = new File(tmpPath, "fm2sql" + generateSuffix(count++) + ".txt"); + } file = new FileOutputStream(temp); } catch (FileNotFoundException e1) { e1.printStackTrace(); } PrintStream stream = new PrintStream(file, true); + // write info for user to stdout + System.out.println(versionID); + System.out.println("Loading " + args[0] + "...."); + System.out.println("Log will be written to " + temp.getCanonicalPath()); + if (!debug) { System.setOut(stream); System.setErr(stream); } + System.out.println(versionID); + System.out.println("Using config file : " + args[0] + "...."); + StringBuffer sb = readXMLFile(args[0]); parseXMLConfig(sb); if (!(new File(args[0]).exists())) - System.exit(0); + { + System.exit(0); + } System.out.println("Finished!"); // convert("jdbc:fmpro:http://141.14.237.74:8050","jdbc:postgresql://erebos/test",null,null); } @@ -238,8 +272,9 @@ class Convert String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString(); query = (selects != null) ? selects.get(tbIndex).toString() : query; // if vectors[1].get(i) != null) - if (layout != "") + if (!layout.equals("")) { + query = addLayoutToQuery(names, query, tbIndex, layout); } @@ -417,7 +452,7 @@ class Convert public static void convert(String source, String destination, Vector names, Vector layouts, Vector selects, Vector creates, Vector ids, int mode, String delimiter) throws Exception { - + // TODO implement convert_temp mode!!! FM2SQL.ProgressDialog dialog = null; if (isGUI) @@ -462,7 +497,7 @@ class Convert String layout = (layouts.isEmpty()) ? "" : layouts.get(tbIndex).toString(); query = (selects != null) ? selects.get(tbIndex).toString() : "select * from " + bean.getQC() + names.get(tbIndex).toString() + bean.getQC(); - if (layout != "") + if (layout.intern() != "") { query = addLayoutToQuery(names, query, tbIndex, layout); @@ -502,16 +537,29 @@ class Convert ConversionProperties prop = getFieldNamesAndDestTableName(creates.get(tbIndex).toString(), query, names.get(tbIndex).toString()); destTableName = prop.destTableName; + if (mode == Convert.DataBase.CONVERT_TEMP_MODE) + { + String tableNameSave=destTableName; + destTableName += _TEMP; + if(creates.get(tbIndex)!="") + { + System.out.println("Changed tablename of create statement to "+destTableName); + StringBuffer buffer=new StringBuffer(creates.get(tbIndex).toString()); + int startIndex = buffer.indexOf(tableNameSave); + buffer.replace(startIndex,startIndex+tableNameSave.length(),destTableName); + creates.set(tbIndex,buffer.toString()); + } + } + System.out.println("destTableName is now "+destTableName); + fieldNames = prop.fieldNames; - if (mode == Convert.DataBase.CONVERT_MODE) + if (mode == Convert.DataBase.CONVERT_MODE || mode == Convert.DataBase.CONVERT_TEMP_MODE) { - if (tables.indexOf(destTableName) >= 0) { stm.executeUpdate("drop table " + beanDest.getQC() + destTableName + beanDest.getQC()); tables.remove(destTableName); System.out.println("dropped table" + destTableName); - } if ((tables.indexOf(destTableName) < 0)) { @@ -525,7 +573,7 @@ class Convert command = new StringBuffer(50); command.append("CREATE TABLE "); command.append(beanDest.getQC()); - command.append(convertText((String) names.get(tbIndex))); + command.append(destTableName);//convertText((String) names.get(tbIndex))); command.append(beanDest.getQC()); command.append("("); String type = null; @@ -550,8 +598,10 @@ class Convert command.append(" )"); } else - command = new StringBuffer().append(creates.get(tbIndex).toString().toLowerCase()); - stm.executeUpdate(command.toString()); + { + command = new StringBuffer().append(creates.get(tbIndex).toString()); + } + stm.executeUpdate(command.toString()); } } @@ -577,7 +627,6 @@ class Convert command.append(") "); command.append(" values ( "); - // add a question marks for every field for (int i = 0; i < bean.getColumnNames().size() - 1; ++i) command.append("?,"); @@ -619,7 +668,7 @@ class Convert for (int k = 0; k < vec.size() - deltaID; k = k + deltaID) { System.out.println(vec.get(k) + " " + vec.get(k + deltaID) + " " + vec.lastElement()); - if (query.indexOf("where") > 0) + if (query.toLowerCase().indexOf("where") > 0) tempQuery = query + " and " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'"; else @@ -645,7 +694,7 @@ class Convert System.out.println(" last intervall from " + vec.get(endIndex) + " " + vec.lastElement()); - if (query.indexOf("where") > 0) + if (query.toLowerCase().indexOf("where") > 0) tempQuery = query + " and " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'"; else @@ -660,7 +709,7 @@ class Convert command = writeDatainDestTable(dialog, command, endIndex, pstm, rowCount, delimiter); } // prepare new query for next chunk - if (query.indexOf("where") > 0) + if (query.toLowerCase().indexOf("where") > 0) tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'"; else tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'"; @@ -674,6 +723,7 @@ class Convert long startTime = System.currentTimeMillis(); bean.makeQuery(query, 0); + System.err.println("query for whole table done"); command = writeDatainDestTable(dialog, command, j, pstm, rowCount, delimiter); long endTime = System.currentTimeMillis(); System.out.println("Time for old convert elapsed " + (endTime - startTime)); @@ -681,10 +731,31 @@ class Convert } if (isGUI) resetGUI(dialog); + noError = true; + if (mode == Convert.DataBase.CONVERT_TEMP_MODE) + { + String originalName = destTableName.split(_TEMP)[0]; + // TODO + if (beanDest.getTableNames().contains(originalName)) + { + DateFormat d = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM); + d.setTimeZone(java.util.TimeZone.getTimeZone("CET")); + + String date = d.format(new Date()); + date = date.replace(':', '_'); + String newName = addQuotes(beanDest, convertText(originalName + "_" + date)); + // rename table to newName + renameTable(beanDest, addQuotes(beanDest, originalName), newName); + } + // rename Table_temp to originalName + renameTable(beanDest, addQuotes(beanDest, destTableName), addQuotes(beanDest, + originalName)); + } } } catch (Exception e) { - System.out.println("Error while connecting to database " + e); + System.out.println("Error while connecting to database " + e.getMessage()); + noError = false; if (isGUI) { showExceptionDialog(dialog, command, e); @@ -694,11 +765,28 @@ class Convert e.printStackTrace(); } + } catch (Error e) + { + noError = false; + + System.out.println(e); + e.printStackTrace(); } } /** + * + * @param beanDest2 + * @param originalName + * @return + */ + private static String addQuotes(DBBean bean, String originalName) + { + return bean.getQC() + originalName + bean.getQC(); + } + + /** * @param names * @param dialog * @param tbIndex @@ -750,41 +838,39 @@ class Convert throws Exception, SQLException { Vector row; - while ((row = bean.getNextRow()) != null) - { - j++; - Object obj = null; - for (int k = 0; k < row.size(); ++k) - { - obj = row.get(k); - - if (obj instanceof ArrayList) - obj = formatFileMakerArray((List) obj, delimiter); - - String str = (obj == null) ? "NULL" : obj.toString(); - if (obj instanceof Double) - { - pstm.setDouble(k + 1, ((Double) obj).doubleValue()); - } else if (!str.equals("NULL")) - pstm.setString(k + 1, str); - else - pstm.setNull(k + 1, Types.NULL); - } - pstm.execute(); - if (isGUI) - dialog.progress.setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0)); - command = null; - } // to while loop + while ((row = bean.getNextRow()) != null) { + j++; + Object obj = null; + for (int k = 0; k < row.size(); ++k) { + obj = row.get(k); + + if (obj instanceof ArrayList) + obj = formatFileMakerArray((List) obj, delimiter); + + String str = (obj == null) ? "NULL" : obj.toString(); + if (obj instanceof Double) { + pstm.setDouble(k + 1, ((Double) obj).doubleValue()); + } else if (!str.equals("NULL")) + pstm.setString(k + 1, str); + else + pstm.setNull(k + 1, Types.NULL); + } + pstm.execute(); + if (isGUI) + dialog.progress + .setValue((int) (((double) (j + 1) / (double) rowCount) * 100.0)); + command = null; + } // to while loop return command; } /** - * removes special characters from the input string as well as .fp5 - * - * @param newName - * String to change - * @return - */ + * removes special characters from the input string as well as .fp5 + * + * @param newName + * String to change + * @return + */ public static String convertText(String newName) { StringBuffer alterMe = new StringBuffer(newName.trim().toLowerCase()); @@ -981,9 +1067,19 @@ class Convert try { databases = getXMLConfig(sb); - + + // destination DataBase object + DataBase dbDest = ((DataBase) databases.lastElement()); + DBBean database = ((DataBase) databases.lastElement()).bean; databases.remove(databases.size() - 1); + + for (Iterator iterator = dbDest.preCommands.iterator(); iterator.hasNext();) + { + SQLCommand sqlCommand = (SQLCommand) iterator.next(); + sqlCommand.executeCommand(); + } + // databases.add(database); for (Iterator iter = databases.iterator(); iter.hasNext();) { @@ -994,6 +1090,24 @@ class Convert sqlCommand.executeCommand(); } int mode = db.mode; + if (mode == DataBase.CONVERT_TEMP_MODE) + { + convertBatch(db.bean, database, db.tables, db.layouts, db.selects, db.creates, db.ids, + mode, db.delimiter); + if (noError) + { + System.out.println("no Error occured "); + // db.bean.setURL(database.url); + // db.bean.setUserAndPasswd(database.user,database.passwd); + // + // Convert.user = db.bean.user; + // Convert.passwd = db.bean.passwd; + // userDest = database.user; + // passwdDest = database.passwd; + // synchronize(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, + // db.ids, mode, db.delimiter, new Vector(db.htIndex.values())); + } + } if (mode == DataBase.CONVERT_MODE || mode == DataBase.APPEND_MODE) convertBatch(db.bean, database, db.tables, db.layouts, db.selects, db.creates, db.ids, mode, db.delimiter); @@ -1015,7 +1129,7 @@ class Convert passwdDest = database.passwd; synchronize(db.bean.url, database.url, db.tables, db.layouts, db.selects, db.creates, - db.ids, mode, db.delimiter, new Vector(db.htIndex.values())); + db.ids, mode, db.delimiter, new Vector(db.htIndex.values()), db.destIDs); } for (Iterator iterator = db.postCommands.iterator(); iterator.hasNext();) { @@ -1024,6 +1138,11 @@ class Convert } } + for (Iterator iterator = dbDest.postCommands.iterator(); iterator.hasNext();) + { + SQLCommand sqlCommand = (SQLCommand) iterator.next(); + sqlCommand.executeCommand(); + } } catch (Exception e) { @@ -1037,6 +1156,21 @@ class Convert } } + /** + * + * @param database + * @param db + * @throws Exception + * @throws SQLException + */ + private static void renameTable(DBBean database, String sourceTable, String destTable) + throws SQLException, Exception + { + String command = "alter table " + sourceTable + " rename " + " to " + destTable; + SQLCommand sqlCommand = new SQLCommand(database, command); + sqlCommand.executeCommand(); + } + public static Vector getXMLConfig(StringBuffer sb) { @@ -1052,6 +1186,8 @@ class Convert Vector selects = new Vector(); Vector creates = new Vector(); Vector ids = new Vector(); + Vector destIDs = new Vector(); + Vector preSQLCommands = new Vector(); Vector postSQLCommands = new Vector(); @@ -1074,6 +1210,8 @@ class Convert selects = new Vector(); creates = new Vector(); ids = new Vector(); + destIDs = new Vector(); + preSQLCommands = new Vector(); postSQLCommands = new Vector(); @@ -1143,6 +1281,10 @@ class Convert else if (modeString.equals("synchronize")) mode = DataBase.SYNCHRONIZE_MODE; + else if (modeString.equals("convert_temp")) + mode = DataBase.CONVERT_TEMP_MODE; + + System.out.println("mode ist "+mode); // if(node3!=null) // System.out.println(node3.name); @@ -1174,7 +1316,9 @@ class Convert String name = (String) node4.attributes.get("name"); String layout = (String) node4.attributes.get("layout"); String id = (String) node4.attributes.get("id"); + String destID = (String) node4.attributes.get("targetID"); System.out.println("id was " + id); + System.out.println("targetID was " + destID); if (name == null) throw new Error("parse error required table tag attribute name missing"); @@ -1182,11 +1326,15 @@ class Convert layout = ""; if (id == null) id = ""; + if (destID == null) + destID = id ; + if (name.equals("")) throw new Error("parse error table tag attribute must not be empty"); - tables.add(name); - layouts.add(layout); - ids.add(id); + tables.add(name.intern()); + layouts.add(layout.intern()); + ids.add(id.intern()); + destIDs.add(destID.intern()); String query = (node5 == null) ? "" : node5.getCharacters(); if (query.equals("")) System.err.println("Warning empty select tag or select tag missing !!"); @@ -1203,6 +1351,7 @@ class Convert dataBase.delimiter = delimiter; dataBase.preCommands = new Vector(preSQLCommands); dataBase.postCommands = new Vector(postSQLCommands); + dataBase.destIDs = destIDs; databases.add(dataBase); } DBBean database = new DBBean(); @@ -1396,6 +1545,7 @@ class Convert */ public static class DataBase { + DBBean bean; Vector creates; @@ -1404,9 +1554,10 @@ class Convert Vector layouts; - Vector tables=new Vector(); + Vector tables = new Vector(); Vector ids; + Vector destIDs; String delimiter = "//"; @@ -1430,6 +1581,8 @@ class Convert final static int SYNCHRONIZE_MODE = 5; + final static int CONVERT_TEMP_MODE = 6; + int mode = -1; public DataBase(DBBean bean, Vector tables, Vector layouts, Vector selects, Vector creates, @@ -1471,7 +1624,9 @@ class Convert buffr.write(" " + bean.passwd + "\n"); buffr.write(" " + delimiter + "\n"); String modeString = ""; - if (mode == CONVERT_MODE) + if (mode == CONVERT_TEMP_MODE) + modeString = "convert_temp"; + else if (mode == CONVERT_MODE) modeString = "convert"; else if (mode == APPEND_MODE) modeString = "append"; @@ -1495,8 +1650,9 @@ class Convert { while (count < preCommands.size()) { - SQLCommand sqlcommand=(SQLCommand)preCommands.get(count); - buffr.write(" " + sqlcommand.command + "\n"); + SQLCommand sqlcommand = (SQLCommand) preCommands.get(count); + buffr.write(" " + sqlcommand.command + + "\n"); count++; } } @@ -1505,9 +1661,10 @@ class Convert count = 0; while (count < postCommands.size()) { - SQLCommand sqlcommand=(SQLCommand)postCommands.get(count); - - buffr.write(" " + sqlcommand.command + "\n"); + SQLCommand sqlcommand = (SQLCommand) postCommands.get(count); + + buffr.write(" " + sqlcommand.command + + "\n"); count++; } } @@ -1747,7 +1904,7 @@ class Convert command = null; } // prepare new query for next chunk - if (query.indexOf("where") > 0) + if (query.toLowerCase().indexOf("where") > 0) tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'"; else tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'"; @@ -1772,7 +1929,6 @@ class Convert /** * synchronize method based on delete method code - * * @param source * @param destination * @param names @@ -1781,12 +1937,14 @@ class Convert * @param creates * @param ids * @param mode + * @param destIDs TODO + * * @throws Exception */ // TODO implement append,update and delete in one method // TODO using id based algorithm public static void synchronize(String source, String destination, Vector names, Vector layouts, - Vector selects, Vector creates, Vector ids, int mode, String delimiter, Vector indexList) + Vector selects, Vector creates, Vector ids, int mode, String delimiter, Vector indexList, java.util.Vector destIDs) throws Exception { System.out.println(" bin in synchronize!!!"); @@ -1817,6 +1975,7 @@ class Convert java.util.TreeSet myIdsDest = new TreeSet(); int deltaID = 1; String idField = ""; + String destIDField = ""; String destTableName = ""; try @@ -1837,7 +1996,7 @@ class Convert bean.getConnection(); bean.makeQuery(query, 50); idField = ids.get(tbIndex).toString(); - + destIDField = (destIDs!=null) ? destIDs.get(tbIndex).toString():convertText(idField); } catch (Exception e) { System.out.println("Warning exception occured \n " + e); @@ -1877,7 +2036,7 @@ class Convert // remove extra query parts // destQuery.substring(0,destQuery.lastIndexOf(destTableName)+destTableName.length()+1); System.out.println("new Query " + tempQueryDest); - System.out.println("idfield " + idField + " " + ids.get(tbIndex).toString()); + System.out.println("idfield " + idField + " " + ids.get(tbIndex).toString()+" targetID is "+destIDField); if (!idField.equals("")) { long startTime = System.currentTimeMillis(); @@ -1894,7 +2053,7 @@ class Convert myIds = bean.getIDVector(ids.get(tbIndex).toString(), (String) names.get(tbIndex), tempQuery, 0); - myIdsDest = beanDest.getIDVector(convertText(idField), destTableName, tempQueryDest, 0); + myIdsDest = beanDest.getIDVector(destIDField, destTableName, tempQueryDest, 0); // System.out.println("status of remove // "+myIds.remove("b015892")); System.out.println("ids found for " + idField + " " + !myIds.isEmpty()); @@ -1907,7 +2066,7 @@ class Convert Vector deleted = new Vector(vec); TreeSet linesToAppend = new TreeSet(vec); - linesToAppend.addAll(vec); + // linesToAppend.addAll(vec); linesToDelete = new TreeSet(vecDest); // remove all lines that are already in dest database linesToAppend.removeAll(vecDest); @@ -1941,7 +2100,7 @@ class Convert for (int k = 0; k < vec.size() - deltaID; k = k + deltaID) { System.out.println(vec.get(k) + " " + vec.get(k + deltaID) + " " + vec.lastElement()); - if (query.indexOf("where") > 0) + if (query.toLowerCase().indexOf("where") > 0) tempQuery = query + " and " + tempID + ">='" + vec.get(k) + "' and " + tempID + "<='" + vec.get(k + deltaID) + "'"; else @@ -1971,7 +2130,7 @@ class Convert System.out.println(" last intervall from " + vec.get(endIndex) + " " + vec.lastElement()); - if (query.indexOf("where") > 0) + if (query.toLowerCase().indexOf("where") > 0) tempQuery = query + " and " + tempID + ">='" + vec.get(endIndex) + "' and " + tempID + "<='" + vec.lastElement() + "'"; else @@ -1990,7 +2149,7 @@ class Convert // numIntervalls) + " " + myIdsDest.size()); } // prepare new query for next chunk - if (query.indexOf("where") > 0) + if (query.toLowerCase().indexOf("where") > 0) tempQuery = query + " and " + tempID + ">'" + vec.lastElement() + "'"; else tempQuery = query + " where " + tempID + ">'" + vec.lastElement() + "'"; @@ -2056,7 +2215,7 @@ class Convert // CREATE UNIQUE INDEX title_idx ON films (title); for (Iterator iter = linesToDelete.iterator(); iter.hasNext();) { - String id = (String) iter.next(); + String id = iter.next().toString(); delPSt.setString(1, id); delPSt.execute(); @@ -2104,7 +2263,7 @@ class Convert dialog.title.setText("Retrieving new data"); } - Vector[] vectors = bean.getQueryData(tempQuery, deltaID); + Vector[] vectors = bean.getQueryData(tempQuery, 0); int count = 0, size = vectors[0].size(); int idIndex = vectors[1].indexOf(idField); // System.out.println(idIndex + " " + vectors[1] + " " + idField); @@ -2117,7 +2276,7 @@ class Convert Vector line = (Vector) iter.next(); Object lineIDIndex = line.get(idIndex); if (linesToAppend.contains(lineIDIndex)) - System.out.println("line " + linesToAppend.contains(line.get(idIndex)) + " " + lineIDIndex); + System.out.println("line " + linesToAppend.contains(lineIDIndex) + " " + lineIDIndex); if (linesToAppend.contains(lineIDIndex)) { for (int l = 0; l < line.size(); ++l) @@ -2147,7 +2306,8 @@ class Convert } updPst.setString(line.size() + 1, line.get(idIndex).toString()); // updPst.addBatch(); - // updPst.execute(); + // System.out.println("updating "+line.get(idIndex).toString()+" "+line); + updPst.execute(); } if (dialog != null) { @@ -3638,7 +3798,7 @@ class Convert // retrieve field_names from select statement // TODO problem with different fieldNames in create statement will // overwrite them - if (query.indexOf("*") < 0) + if (query.indexOf("*") < 0 && create.equals(""))// quick hack for hartmut { int selectEndIndex = query.indexOf("from"); StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ","); @@ -3677,7 +3837,7 @@ class Convert // retrieve field_names from select statement if (query.indexOf("*") < 0) { - int selectEndIndex = query.indexOf("from"); + int selectEndIndex = query.lastIndexOf("from"); StringTokenizer tokenizer = new StringTokenizer(query.substring(6, selectEndIndex), ","); int numFields = tokenizer.countTokens(); fieldNames = new String[numFields]; @@ -3685,7 +3845,11 @@ class Convert while (tokenizer.hasMoreTokens()) { String fieldName = tokenizer.nextToken().trim(); - fieldNames[fieldIndex] = beanDest.getQC() + convertText(fieldName) + beanDest.getQC(); + String text = convertText(fieldName); + if (text.indexOf("\"") >= 0) + fieldNames[fieldIndex] = convertText(fieldName); + else + fieldNames[fieldIndex] = beanDest.getQC() + convertText(fieldName) + beanDest.getQC(); // System.out.println("field "+ fieldNames[fieldIndex]); fieldIndex++; } @@ -3830,4 +3994,17 @@ class Convert // ****** end Test ****** } + + public final static String generateSuffix(final int step) + { + String fileString = null; + if (step < 10) + fileString = "00" + step; + else if (step < 100) + fileString = "0" + step; + else + fileString = step + ""; + return fileString; + } + } \ No newline at end of file