* the Printer configuration options (if any are already set).
* @return A Map of printer settings extracted from the print dialog.
*/
- public Map<String,Object> configurePrinter(
- Map<String,Object> params) throws IllegalArgumentException {
+ public JSONObject configurePrinter(
+ JSONObject params) throws IllegalArgumentException {
- @SuppressWarnings("unchecked")
- Map<String,Object> settings =
- (Map<String,Object>) params.get("config");
+ JSONObject settings = params.getJSONObject("config");
PrinterJob job = buildPrinterJob(settings);
long msgid = request.getLong("msgid");
response.put("msgid", msgid);
- /*
- Long msgid = (Long) params.get("msgid");
- Boolean showDialog = (Boolean) params.get("showDialog");
+ boolean showDialog = request.optBoolean("showDialog");
- @SuppressWarnings("unchecked")
- Map<String,Object> settings =
- (Map<String,Object>) params.get("config");
+ // if no "settings" are applied, use defaults.
+ JSONObject settings = request.optJSONObject("settings");
+ if (settings == null) settings = new JSONObject();
+ PrinterJob job = buildPrinterJob(settings);
- PrinterJob job = null;
-
- try {
- job = buildPrinterJob(settings);
- } catch(IllegalArgumentException e) {
- //socket.reply(e.toString(), msgid, false);
- return;
- }
-
- if (showDialog != null && showDialog.booleanValue()) {
- //logger.info("Print dialog requested");
-
- if (!job.showPrintDialog(null)) {
- // job canceled by user
- //logger.info("after dialog");
- job.endJob();
- //socket.reply("Print job canceled", msgid);
- return;
+ if (showDialog) {
+ if (!job.showPrintDialog(null)) {
+ job.endJob(); // canceled by user
+ response.put("error", "Print job canceled by user");
+ RequestHandler.reply(response);
+ return;
+ }
}
- } else {
- //logger.info("No print dialog requested");
- }
-
- engine.print(job);
-
- job.endJob();
- //socket.reply("Print job succeeded", msgid);
-
- */
+ engine.print(job);
+ job.endJob();
+ response.put("message", "Print job queued");
+ // TODO: support watching the print job until it completes
} catch (JSONException je) {
+
String error = "JSON request protocol error: "
+ je.toString() + " : " + request.toString();
logger.warning(error);
response.put("error", error);
+
+ } catch(IllegalArgumentException iae) {
+
+ String error = "Illegal argument in print request: "
+ + iae.toString() + " : " + request.toString();
+
+ logger.warning(error);
+ response.put("error", error);
}
RequestHandler.reply(response);
* @return The newly created printer job.
*/
public PrinterJob buildPrinterJob(
- Map<String,Object> settings) throws IllegalArgumentException {
+ JSONObject settings) throws IllegalArgumentException {
- String name = (String) settings.get("printer");
- Printer printer = getPrinterByName(name);
+ Printer printer;
+ if (settings.has("printer")) {
+ String name = settings.getString("printer");
+ printer = getPrinterByName(name);
+ if (printer == null)
+ throw new IllegalArgumentException("No such printer: " + name);
- if (printer == null)
- throw new IllegalArgumentException("No such printer: " + name);
+ } else {
+ printer = Printer.getDefaultPrinter();
+ if (printer == null)
+ throw new IllegalArgumentException(
+ "No printer specified; no default printer is set");
+ }
PageLayout layout = buildPageLayout(settings, printer);
PrinterJob job = PrinterJob.createPrinterJob(printer);
* @return The newly constructed PageLayout object.
*/
protected PageLayout buildPageLayout(
- Map<String,Object> settings, Printer printer) {
+ JSONObject settings, Printer printer) {
- // modify the default page layout with our settings
- @SuppressWarnings("unchecked")
- Map<String,Object> layoutMap =
- (Map<String,Object>) settings.get("pageLayout");
+ JSONObject layoutMap = settings.optJSONObject("pageLayout");
if (layoutMap == null) {
- // Start with a sane default.
- // The Java default is wonky
+ // Start with a sane default. The Java default is wonky.
return printer.createPageLayout(
Paper.NA_LETTER,
PageOrientation.PORTRAIT,
* @param settings The printer configuration settings map.
* @param job A PrinterJob, constructed from buildPrinterJob()
*/
- protected void applySettingsToJob(
- Map<String,Object> settings, PrinterJob job) {
+ protected void applySettingsToJob(JSONObject settings, PrinterJob job) {
JobSettings jobSettings = job.getJobSettings();
PrinterAttributes printerAttrs =
job.getPrinter().getPrinterAttributes();
- String collation = (String) settings.get("collation");
- Long copies = (Long) settings.get("copies");
- String printColor = (String) settings.get("printColor");
- String printQuality = (String) settings.get("printQuality");
- String printSides = (String) settings.get("printSides");
- String paperSource = (String) settings.get("paperSource");
- Object[] pageRanges = (Object[]) settings.get("pageRanges");
+ if (settings.has("collation")) {
+ jobSettings.setCollation(
+ Collation.valueOf(settings.getString("collation")));
+ }
- if (collation != null)
- jobSettings.setCollation(Collation.valueOf(collation));
+ if (settings.has("copies")) {
+ jobSettings.setCopies(settings.getInt("copies"));
+ }
+
+ if (settings.has("printColor")) {
+ jobSettings.setPrintColor(
+ PrintColor.valueOf(settings.getString("printColor")));
+ }
- if (copies != null)
- jobSettings.setCopies(((Long) settings.get("copies")).intValue());
+ if (settings.has("printQuality")) {
+ jobSettings.setPrintQuality(
+ PrintQuality.valueOf(settings.getString("printQuality")));
+ }
- if (printColor != null)
- jobSettings.setPrintColor(PrintColor.valueOf(printColor));
+ if (settings.has("printSides")) {
+ jobSettings.setPrintSides(
+ PrintSides.valueOf(settings.getString("printSides")));
- if (printQuality != null)
- jobSettings.setPrintQuality(PrintQuality.valueOf(printQuality));
+ }
- if (printSides != null)
- jobSettings.setPrintSides(PrintSides.valueOf(printSides));
+ String paperSource = settings.optString("paperSource");
- // find the paperSource by name
if (paperSource != null) {
+ // find the paperSource by name
+
Set<PaperSource> paperSources =
printerAttrs.getSupportedPaperSources();
- // note: "Automatic" appears to be a virtual source,
- // meaning no source.. meaning let the printer decide.
for (PaperSource source : paperSources) {
if (source.getName().equals(paperSource)) {
- //logger.info("matched paper source for " + paperSource);
+ logger.fine("Found paper source: " + paperSource);
jobSettings.setPaperSource(source);
break;
}
}
}
+ JSONArray pageRanges = settings.optJSONArray("pageRanges");
if (pageRanges != null) {
- //logger.info("pageRanges = " + pageRanges.toString());
List<PageRange> builtRanges = new LinkedList<PageRange>();
int i = 0, start = 0, end = 0;
do {
if (i % 2 == 0 && i > 0)
builtRanges.add(new PageRange(start, end));
- if (i == pageRanges.length) break;
+ if (i == pageRanges.length()) break;
- int current = ((Long) pageRanges[i]).intValue();
+ int current = pageRanges.getInt(i);
if (i % 2 == 0) start = current; else end = current;
} while (++i > 0);
* @param job The PrinterJob whose attributes are to be extracted.
* @return The extracted printer settings map.
*/
- protected Map<String,Object> extractSettingsFromJob(PrinterJob job) {
- Map<String,Object> settings = new HashMap<String,Object>();
+ protected JSONObject extractSettingsFromJob(PrinterJob job) {
+ JSONObject settings = new JSONObject();
JobSettings jobSettings = job.getJobSettings();
//logger.info("Extracting print job settings from " + job);
// page layout --------------
PageLayout layout = jobSettings.getPageLayout();
- Map<String,Object> layoutMap = new HashMap<String,Object>();
+ JSONObject layoutMap = new JSONObject();
layoutMap.put("bottomMargin", layout.getBottomMargin());
layoutMap.put("leftMargin", layout.getLeftMargin());
layoutMap.put("topMargin", layout.getTopMargin());
// page ranges --------------
PageRange[] ranges = jobSettings.getPageRanges();
if (ranges != null) {
- List<Integer> pageRanges = new LinkedList<Integer>();
+ JSONArray pageRanges = new JSONArray();
if (ranges.length == 1 &&
ranges[0].getStartPage() == 1 &&
} else {
for (PageRange range : ranges) {
- pageRanges.add(range.getStartPage());
- pageRanges.add(range.getEndPage());
+ pageRanges.put(range.getStartPage());
+ pageRanges.put(range.getEndPage());
}
settings.put("pageRanges", pageRanges);
}
}
- //logger.info("compiled printer properties: " + settings.toString());
return settings;
}