From: gumartinm
- * First of all some thoughts:
- *
- * The device wrapper classes lack methods to change themselves the device configuration.
- * These methods can be found in the Logical layer, so this layer is device-dependent
- * (it just will work with JavaPOS devices)
- * Actually we have two options in order to write specific methods related to the device
- * configuration. We can add these methods to the Logical layer or create a new Helper Class
- * for them but... What about if we need to add device specific methods? The Logical layer is right
- * now JavaPOS dependent (although it was intended to be a device abstraction...) if we add
- * device specific methods such as methods related to a specific kind of Printer, the Logical
- * layer will be useless and the code will be a mess (if some day a device is changed we will
- * have to search the whole code to find out what code is related with that device and
- * we will have to create new classes in the Logical layer for every device )
- *
- * So this Helper is intended to store methods which do not fit into the Logical layer because
- * they make this layer not just JPOS dependent but completely device-dependent. All of this because
- * of the wrapper classes lack the required methods for these kinds of operations.
- *
- * To sum up, before adding in this class new methods you should ask yourself two questions:
- *
- *
- *
- *
- * Instances of this class are mutable. To use them concurrently, clients must surround each - * method invocation (or invocation sequence) with external synchronization of the clients' choosing. - *
- */ -public final class PrinterHelper { - private static final Logger logger = Logger.getLogger(PrinterHelper.class); - private static final String HOME_ENV_KEY = "HOME"; - private static final String FORM_PROPERTIES_FILE_RELATIVE_PATH = "etc/"+ FormConfiguration.PROPERTIES_FILE; - private static final String TEMPLATE_FILE_EXTENSION = ".frm"; - private static final String PRINTER_PROPERTY = "MethodToPrintImage"; - private static final String PRINTER_PROPERTY_VALUE = "ESC/POS"; - - // Prevents instantiation from other classes. Why do you want to extend this class? - private PrinterHelper() { } - - - /** - * This method must try and fetch the model of the currently connected form printer (physically) - * on the given port - * - * @param formPrinterPort the printer port. - * @return the model printer as a {@code FormPrinterModel enum} class - * The firstchar
value is at index 0
.
- */
- public static FormPrinterModel autoDetetectFormPrinterModel(final Port formPrinterPort)
- {
- FormPrinterModel formPrinterModelDetected = null;
-
- final File scriptAutoDetect = new File(System.getProperty(HOME_ENV_KEY),"tools/detectatm88.sh");
- if (scriptAutoDetect.exists() && scriptAutoDetect.canExecute()){
-
-
- final ByteArrayOutputStream baos = new ByteArrayOutputStream();
- final PrintStream output = new PrintStream(baos);
-
- final String command = "sh " + scriptAutoDetect.getAbsolutePath() + " " + formPrinterPort.getPhysicalPath();
- try {
- int result;
-
- //result field stores exit status of the executed command
- result = LauncherProcesses.exec(command,output);
-
- if(result==0)
- {
- logger.debug("detectatm88 raw output: "+baos.toString());
- //From detectatm88.sh script we receive a string like this one: "RESULT: 2"
- //we must split the String and retrieve the integer value
- final String[] parameters = baos.toString().split(" ");
- final int model = Integer.parseInt(parameters[1].trim());
- switch(model){
- case 0:
- logger.warn("TM88 not physically detected: run again detectatm88.sh script");
- formPrinterModelDetected = null;
- break;
- case 2:
- logger.info("TM-T88II detected");
- formPrinterModelDetected = FormPrinterModel.EPSON_TM_88_II_III;
- PrinterHelper.addFormPrinterProperty(PRINTER_PROPERTY, PRINTER_PROPERTY_VALUE);
- break;
- case 3:
- logger.info("TM-T88III detected");
- formPrinterModelDetected = FormPrinterModel.EPSON_TM_88_II_III;
- PrinterHelper.addFormPrinterProperty(PRINTER_PROPERTY, PRINTER_PROPERTY_VALUE);
- break;
- case 4:
- logger.info("TM-T88IV detected");
- formPrinterModelDetected = FormPrinterModel.EPSON_TM_88_IV;
- PrinterHelper.addFormPrinterProperty(PRINTER_PROPERTY, PRINTER_PROPERTY_VALUE);
- break;
- case 5:
- logger.info("TM-T88V detected");
- formPrinterModelDetected = FormPrinterModel.EPSON_TM_88_V;
- PrinterHelper.removeFormPrinterProperty(PRINTER_PROPERTY);
- break;
- default:
- logger.warn("Code retrieved from detectatm88.sh script does not match.");
- formPrinterModelDetected = null;
- break;
- }
- }
- //model not detected
- else{
- logger.warn("TM88 not physically detected. Not conected printer or it is not a TM-T88");
- }
- } catch (Exception e) {
- logger.error(e);
- }
- }
- else {
- logger.warn("Script for tm88 detection not found or not exectuable");
- }
-
- return formPrinterModelDetected;
- }
-
- /**
- * This method is intended to add new properties in DtgFormToPrint.properties file used by TM88 printers.
- *
- * @param property the property to be added
- * @param value value of property param. Possible values:
- * + * First of all some thoughts: + *
+ *+ * The device wrapper classes lack methods for changing themselves the device configuration. + * These methods can be found in the Logical layer, so this layer is device-dependent + * (it just will work with JavaPOS devices) + * Actually we have two options in order to write specific methods related to the device + * configuration. We can add these methods to the Logical layer or create a new Helper Class + * for them but... What about if we need to add device specific methods? The Logical layer is right + * now JavaPOS dependent (although it was intended to be a device abstraction...) if we add + * device specific methods such as methods related to a specific kind of Printer, the Logical + * layer will be useless and the code will be a mess (if some day a device is changed we will + * have to search the whole code to find out what code is related with that device and + * we will have to create new classes in the Logical layer for every device ) + *
+ *+ * So this Helper is intended to store methods which do not fit into the Logical layer because + * they make this layer not just JPOS dependent but completely device-dependent. All of this because + * of the wrapper classes lack the required methods for these kinds of operations. + *
+ *+ * To sum up, before adding in this class new methods you should ask yourself two questions: + *
+ * Instances of this class are mutable. To use them concurrently, clients must surround each + * method invocation (or invocation sequence) with external synchronization of the clients choosing. + *
+ */ +public class PrinterLogicalHelper { + private static final Logger logger = Logger.getLogger(PrinterLogicalHelper.class); + private static final String FORM_PROPERTIES_FILE_RELATIVE_PATH = "etc/"+ FormConfiguration.PROPERTIES_FILE; + private static final String HOME_ENV_KEY = "HOME"; + private static final String TEMPLATE_FILE_EXTENSION = ".frm"; + private static final String PRINTER_PROPERTY = "MethodToPrintImage"; + private static final String PRINTER_PROPERTY_VALUE = "ESC/POS"; + private static final String PATTERN_TO_TM88V = "methodToPrintImage(ESC/POS)"; + private static final String PATTERN_FROM_TM88V = "usePageMode(false)"; + private static final String LINE_REPLACEMENT_TO_TM88V = " COMMENT \"usePageMode(false)\""; + private static final String LINE_REPLACEMENT_FROM_TM88V = " COMMENT \"usePageMode(false) methodToPrintImage(ESC/POS)\""; + + // Prevents instantiation from other classes. Why do you want to extend this class? + private PrinterLogicalHelper() { } + + + /** + * This method must try and fetch the model of the currently connected form printer (physically) + * on the given port + * + * @param formPrinterPort the printer port. + * @return the model printer as a {@link FormPrinterModel} class + * + */ + public final static FormPrinterModel autoDetetectFormPrinterModel(final Port formPrinterPort) + { + FormPrinterModel formPrinterModelDetected = null; + + final File scriptAutoDetect = new File(System.getProperty(HOME_ENV_KEY),"tools/detectatm88.sh"); + if (scriptAutoDetect.exists() && scriptAutoDetect.canExecute()){ + + + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final PrintStream output = new PrintStream(baos); + + final String command = "sh " + scriptAutoDetect.getAbsolutePath() + " " + formPrinterPort.getPhysicalPath(); + try { + int result; + + //result field stores exit status of the executed command + result = LauncherProcesses.exec(command,output); + + if(result==0) + { + logger.debug("detectatm88 raw output: "+baos.toString()); + //From detectatm88.sh script we receive a string like this one: "RESULT: 2" + //we must split the String and retrieve the integer value + final String[] parameters = baos.toString().split(" "); + final int model = Integer.parseInt(parameters[1].trim()); + switch(model){ + case 0: + logger.warn("TM88 not physically detected: run again detectatm88.sh script"); + formPrinterModelDetected = null; + break; + case 2: + logger.info("TM-T88II detected"); + formPrinterModelDetected = FormPrinterModel.EPSON_TM_88_II_III; + break; + case 3: + logger.info("TM-T88III detected"); + formPrinterModelDetected = FormPrinterModel.EPSON_TM_88_II_III; + break; + case 4: + logger.info("TM-T88IV detected"); + formPrinterModelDetected = FormPrinterModel.EPSON_TM_88_IV; + break; + case 5: + logger.info("TM-T88V detected"); + formPrinterModelDetected = FormPrinterModel.EPSON_TM_88_V; + break; + default: + logger.warn("Code retrieved from detectatm88.sh script does not match."); + formPrinterModelDetected = null; + break; + } + } + //model not detected + else{ + logger.warn("TM88 not physically detected. Not conected printer or it is not a TM-T88"); + } + } catch (Exception e) { + logger.error(e); + } + } + else { + logger.warn("Script for tm88 detection not found or not exectuable"); + } + + return formPrinterModelDetected; + } + + /** + * This method is intended to add new properties in DtgFormToPrint.properties file used by TM88 printers. + * + * @param property the property to be added + * @param value value of property param. Possible values: + *checkWrite
method denies write access.
+ * @throws IOException while flushing or closing the DtgFormToPrint.properties file.
+ * @throws NullPointerException if property or value
is null
+ */
+ public final static void addFormPrinterProperty(final String property,
+ final String value) throws FileNotFoundException, IOException
+ {
+ if (property != null && value != null) {
+ //If the property does exist we do not have to add it again
+ if (FormConfiguration.getConfiguration().getSection().get(property) == null)
+ {
+ FormConfiguration.getConfiguration().getSection().add(property,value);
+ OutputStream dtgFormConfigurationFile;
+ dtgFormConfigurationFile = new FileOutputStream
+ (new File(System.getProperty(HOME_ENV_KEY),FORM_PROPERTIES_FILE_RELATIVE_PATH));
+ FormConfiguration.getConfiguration().save(dtgFormConfigurationFile);
+ dtgFormConfigurationFile.flush();
+ dtgFormConfigurationFile.close();
+
+ //We have to reload again the configuration.
+ FormConfiguration.reload();
+ }
+ }
+ else {
+ throw new NullPointerException("Input parameters in addFormPrinterProperty: " +
+ "invalid null. Object is required. First parameter, property: " +
+ property + " Second parameter, value: " + value);
+ }
+ }
+
+ /**
+ * This method is intended to remove properties in DtgFormToPrint.properties file used by TM88 printers.
+ *
+ * @param property property to be removed
+ * @throws FileNotFoundException if the file called DtgFormToPrint.properties is not found.
+ * @throws SecurityException if a security manager exists and its
+ * checkWrite
method denies write access.
+ * @throws IOException while flushing or closing the DtgFormToPrint.properties file.
+ * @throws NullPointerException if property
is null
+ */
+ public final static void removeFormPrinterProperty(final String property) throws FileNotFoundException, IOException
+ {
+ if (property != null) {
+ //If the property does not exist we do not have to remove it
+ if (FormConfiguration.getConfiguration().getSection().get(property) != null)
+ {
+ FormConfiguration.getConfiguration().getSection().remove(property);
+ OutputStream dtgFormConfigurationFile;
+ dtgFormConfigurationFile = new FileOutputStream
+ (new File(System.getProperty(HOME_ENV_KEY),FORM_PROPERTIES_FILE_RELATIVE_PATH));
+ FormConfiguration.getConfiguration().save(dtgFormConfigurationFile);
+ dtgFormConfigurationFile.flush();
+ dtgFormConfigurationFile.close();
+
+ //We have to reload again the configuration.
+ FormConfiguration.reload();
+ }
+ }
+ else {
+ throw new NullPointerException("Input parameter in removeFormPrinterProperty: " +
+ "invalid null. Object is required.");
+ }
+ }
+
+ /**
+ * This method returns a {@code List{@link
+ * java.lang.SecurityManager#checkRead(java.lang.String)}
+ * method denies read access to the directory
+ */
+ public final static ListcheckRead
method denies read access to the file.
+ * @throws IOException if an I/O error occurs while reading the file
+ */
+ public final static ListcheckWrite
method denies write access.
+ */
+ public final static void writeFile (final Listpattern
is null
+ */
+ public final static boolean replaceLine (final Listpattern or lineReplacement
is null
+ */
+ public final static void searchandReplace (final String pattern,
+ final String lineReplacement) throws UnsupportedEncodingException, FileNotFoundException, IOException
+ {
+ if (pattern != null && lineReplacement != null) {
+ final List
+ * This method is smart enough to find out if there is a new form printer model
+ * and write the new configuration in the right files.
+ * It will change the templates and the dtg configuration file if it is required
+ * (right now while switching from TM-T88V to TM-T88X and vice versa)
+ *
It is intended to hide the ins and outs of the whole nasty process.
+ * + * @param oldModel The previous form printer model + * @param newModel The new form printer model + * @throws FileNotFoundException + * @throws UnsupportedEncodingException + * @throws IOException + * If an I/O error occurs while writing or trying to open a file + */ + public final static void changedPrinter (final HardwareModel oldModel, + final HardwareModel newModel) throws UnsupportedEncodingException, FileNotFoundException, IOException + { + if(FormPrinterModel.EPSON_TM_88_V.getXmlDescriptor().equals(newModel.getXmlDescriptor())) + { + PrinterLogicalHelper.searchandReplace(PATTERN_TO_TM88V, LINE_REPLACEMENT_TO_TM88V); + PrinterLogicalHelper.removeFormPrinterProperty(PRINTER_PROPERTY); + } + else if (FormPrinterModel.EPSON_TM_88_V.getXmlDescriptor().equals(oldModel.getXmlDescriptor())) + { + PrinterLogicalHelper.searchandReplace(PATTERN_FROM_TM88V, LINE_REPLACEMENT_FROM_TM88V); + PrinterLogicalHelper.addFormPrinterProperty(PRINTER_PROPERTY, PRINTER_PROPERTY_VALUE); + } + } +} \ No newline at end of file