From: gumartinm
- * 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