/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.component.printer;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Map;
import javax.print.DocFlavor;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.OrientationRequested;
import javax.print.attribute.standard.Sides;
import org.apache.camel.spi.Metadata;
import org.apache.camel.spi.UriParam;
import org.apache.camel.spi.UriParams;
import org.apache.camel.spi.UriPath;
import org.apache.camel.util.ObjectHelper;
import org.apache.camel.util.URISupport;
@UriParams
public class PrinterConfiguration {
private URI uri;
private MediaSizeName mediaSizeName;
private Sides internalSides;
private OrientationRequested internalOrientation;
@UriPath @Metadata(required = "true")
private String hostname;
@UriPath
private int port;
@UriPath
private String printername;
@UriParam
private String printerPrefix;
@UriParam(defaultValue = "1")
private int copies = 1;
@UriParam
private String flavor;
@UriParam
private DocFlavor docFlavor;
@UriParam
private String mimeType;
@UriParam(defaultValue = "na-letter")
private String mediaSize;
@UriParam(defaultValue = "one-sided", enums = "one-sided,duplex,tumble,two-sided-short-edge,two-sided-long-edge")
private String sides;
@UriParam(defaultValue = "portrait", enums = "portrait,landscape,reverse-portrait,reverse-landscape")
private String orientation;
@UriParam(defaultValue = "true")
private boolean sendToPrinter = true;
@UriParam
private String mediaTray;
public PrinterConfiguration() {
}
public PrinterConfiguration(URI uri) throws URISyntaxException {
this.uri = uri;
}
public void parseURI(URI uri) throws Exception {
String protocol = uri.getScheme();
if (!protocol.equalsIgnoreCase("lpr")) {
throw new IllegalArgumentException("Unrecognized Print protocol: " + protocol + " for uri: " + uri);
}
setUri(uri);
setHostname(uri.getHost());
setPort(uri.getPort());
// use path as printer name, but without any leading slashes
String path = uri.getPath();
path = ObjectHelper.removeStartingCharacters(path, '/');
path = ObjectHelper.removeStartingCharacters(path, '\\');
setPrintername(path);
Map<String, Object> printSettings = URISupport.parseParameters(uri);
setFlavor((String) printSettings.get("flavor"));
setMimeType((String) printSettings.get("mimeType"));
setDocFlavor(assignDocFlavor(flavor, mimeType));
setPrinterPrefix((String) printSettings.get("printerPrefix"));
if (printSettings.containsKey("copies")) {
setCopies(Integer.valueOf((String) printSettings.get("copies")));
}
setMediaSize((String) printSettings.get("mediaSize"));
setSides((String) printSettings.get("sides"));
setOrientation((String) printSettings.get("orientation"));
setMediaSizeName(assignMediaSize(mediaSize));
setInternalSides(assignSides(sides));
setInternalOrientation(assignOrientation(orientation));
if (printSettings.containsKey("sendToPrinter")) {
if (!(Boolean.valueOf((String) printSettings.get("sendToPrinter")))) {
setSendToPrinter(false);
}
}
if (printSettings.containsKey("mediaTray")) {
setMediaTray((String) printSettings.get("mediaTray"));
}
}
private DocFlavor assignDocFlavor(String flavor, String mimeType) throws Exception {
// defaults
if (mimeType == null) {
mimeType = "AUTOSENSE";
}
if (flavor == null) {
flavor = "DocFlavor.BYTE_ARRAY";
}
DocFlavor d = DocFlavor.BYTE_ARRAY.AUTOSENSE;
DocFlavorAssigner docFlavorAssigner = new DocFlavorAssigner();
if (mimeType.equalsIgnoreCase("AUTOSENSE")) {
d = docFlavorAssigner.forMimeTypeAUTOSENSE(flavor);
} else if (mimeType.equalsIgnoreCase("GIF")) {
d = docFlavorAssigner.forMimeTypeGIF(flavor);
} else if (mimeType.equalsIgnoreCase("JPEG")) {
d = docFlavorAssigner.forMimeTypeJPEG(flavor);
} else if (mimeType.equalsIgnoreCase("PDF")) {
d = docFlavorAssigner.forMimeTypePDF(flavor);
} else if (mimeType.equalsIgnoreCase("PCL")) {
d = docFlavorAssigner.forMimeTypePCL(flavor);
} else if (mimeType.equalsIgnoreCase("POSTSCRIPT")) {
d = docFlavorAssigner.forMimeTypePOSTSCRIPT(flavor);
} else if (mimeType.equalsIgnoreCase("TEXT_HTML_HOST")) {
d = docFlavorAssigner.forMimeTypeHOST(flavor, mimeType);
} else if (mimeType.equalsIgnoreCase("TEXT_HTML_US_ASCII")) {
d = docFlavorAssigner.forMimeTypeUSASCII(flavor, mimeType);
} else if (mimeType.equalsIgnoreCase("TEXT_HTML_UTF_16")) {
d = docFlavorAssigner.forMimeTypeUTF16(flavor, mimeType);
} else if (mimeType.equalsIgnoreCase("TEXT_HTML_UTF_16LE")) {
d = docFlavorAssigner.forMimeTypeUTF16LE(flavor, mimeType);
} else if (mimeType.equalsIgnoreCase("TEXT_HTML_UTF_16BE")) {
d = docFlavorAssigner.forMimeTypeUTF16BE(flavor, mimeType);
} else if (mimeType.equalsIgnoreCase("TEXT_HTML_UTF_8")) {
d = docFlavorAssigner.forMimeTypeUTF8(flavor, mimeType);
} else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_HOST")) {
d = docFlavorAssigner.forMimeTypeHOST(flavor, mimeType);
} else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_US_ASCII")) {
d = docFlavorAssigner.forMimeTypeUSASCII(flavor, mimeType);
} else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_UTF_16")) {
d = docFlavorAssigner.forMimeTypeUTF16(flavor, mimeType);
} else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_UTF_16LE")) {
d = docFlavorAssigner.forMimeTypeUTF16LE(flavor, mimeType);
} else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_UTF_16BE")) {
d = docFlavorAssigner.forMimeTypeUTF16BE(flavor, mimeType);
} else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_UTF_8")) {
d = docFlavorAssigner.forMimeTypeUTF8(flavor, mimeType);
} else if (mimeType.equalsIgnoreCase("TEXT_HTML")) {
d = docFlavorAssigner.forMimeTypeBasic(flavor, mimeType);
} else if (mimeType.equalsIgnoreCase("TEXT_PLAIN")) {
d = docFlavorAssigner.forMimeTypeBasic(flavor, mimeType);
} else if (mimeType.equalsIgnoreCase("PAGEABLE")) {
d = docFlavorAssigner.forMimeTypePAGEABLE(flavor);
} else if (mimeType.equalsIgnoreCase("PRINTABLE")) {
d = docFlavorAssigner.forMimeTypePRINTABLE(flavor);
} else if (mimeType.equalsIgnoreCase("RENDERABLE_IMAGE")) {
d = docFlavorAssigner.forMimeTypeRENDERABLEIMAGE(flavor);
}
return d;
}
private MediaSizeName assignMediaSize(String size) {
MediaSizeAssigner mediaSizeAssigner = new MediaSizeAssigner();
MediaSizeName answer;
if (size == null) {
// default to NA letter if no size configured
answer = MediaSizeName.NA_LETTER;
} else if (size.toLowerCase().startsWith("iso")) {
answer = mediaSizeAssigner.selectMediaSizeNameISO(size);
} else if (size.startsWith("jis")) {
answer = mediaSizeAssigner.selectMediaSizeNameJIS(size);
} else if (size.startsWith("na")) {
answer = mediaSizeAssigner.selectMediaSizeNameNA(size);
} else {
answer = mediaSizeAssigner.selectMediaSizeNameOther(size);
}
return answer;
}
public Sides assignSides(String sidesString) {
Sides answer;
if (sidesString == null) {
// default to one side if no slides configured
answer = Sides.ONE_SIDED;
} else if (sidesString.equalsIgnoreCase("one-sided")) {
answer = Sides.ONE_SIDED;
} else if (sidesString.equalsIgnoreCase("duplex")) {
answer = Sides.DUPLEX;
} else if (sidesString.equalsIgnoreCase("tumble")) {
answer = Sides.TUMBLE;
} else if (sidesString.equalsIgnoreCase("two-sided-short-edge")) {
answer = Sides.TWO_SIDED_SHORT_EDGE;
} else if (sidesString.equalsIgnoreCase("two-sided-long-edge")) {
answer = Sides.TWO_SIDED_LONG_EDGE;
} else {
answer = Sides.ONE_SIDED;
}
return answer;
}
public OrientationRequested assignOrientation(final String orientation) {
OrientationRequested answer;
if (orientation == null) {
// default to portrait
answer = OrientationRequested.PORTRAIT;
} else if (orientation.equalsIgnoreCase("portrait")) {
answer = OrientationRequested.PORTRAIT;
} else if (orientation.equalsIgnoreCase("landscape")) {
answer = OrientationRequested.LANDSCAPE;
} else if (orientation.equalsIgnoreCase("reverse-portrait")) {
answer = OrientationRequested.REVERSE_PORTRAIT;
} else if (orientation.equalsIgnoreCase("reverse-landscape")) {
answer = OrientationRequested.REVERSE_LANDSCAPE;
} else {
answer = OrientationRequested.PORTRAIT;
}
return answer;
}
public URI getUri() {
return uri;
}
public void setUri(URI uri) {
this.uri = uri;
}
public String getHostname() {
return hostname;
}
/**
* Hostname of the printer
*/
public void setHostname(String hostname) {
this.hostname = hostname;
}
public int getPort() {
return port;
}
/**
* Port number of the printer
*/
public void setPort(int port) {
this.port = port;
}
public String getPrintername() {
return printername;
}
/**
* Name of the printer
*/
public void setPrintername(String printername) {
this.printername = printername;
}
public int getCopies() {
return copies;
}
/**
* Number of copies to print
*/
public void setCopies(int copies) {
this.copies = copies;
}
public String getFlavor() {
return flavor;
}
/**
* Sets DocFlavor to use.
*/
public void setFlavor(String flavor) {
this.flavor = flavor;
}
public DocFlavor getDocFlavor() {
return docFlavor;
}
/**
* Sets DocFlavor to use.
*/
public void setDocFlavor(DocFlavor docFlavor) {
this.docFlavor = docFlavor;
}
public String getMediaSize() {
return mediaSize;
}
/**
* Sets the stationary as defined by enumeration names in the javax.print.attribute.standard.MediaSizeName API.
* The default setting is to use North American Letter sized stationary.
* The value's case is ignored, e.g. values of iso_a4 and ISO_A4 may be used.
*/
public void setMediaSize(String mediaSize) {
this.mediaSize = mediaSize;
}
public String getSides() {
return sides;
}
/**
* Sets one sided or two sided printing based on the javax.print.attribute.standard.Sides API
*/
public void setSides(String sides) {
this.sides = sides;
}
public MediaSizeName getMediaSizeName() {
return mediaSizeName;
}
public void setMediaSizeName(MediaSizeName mediaSizeName) {
this.mediaSizeName = mediaSizeName;
}
public Sides getInternalSides() {
return internalSides;
}
public void setInternalSides(Sides internalSides) {
this.internalSides = internalSides;
}
public OrientationRequested getInternalOrientation() {
return internalOrientation;
}
public void setInternalOrientation(OrientationRequested internalOrientation) {
this.internalOrientation = internalOrientation;
}
public String getOrientation() {
return orientation;
}
/**
* Sets the page orientation.
*/
public void setOrientation(String orientation) {
this.orientation = orientation;
}
public String getMimeType() {
return mimeType;
}
/**
* Sets mimeTypes supported by the javax.print.DocFlavor API
*/
public void setMimeType(String mimeType) {
this.mimeType = mimeType;
}
public boolean isSendToPrinter() {
return sendToPrinter;
}
/**
* etting this option to false prevents sending of the print data to the printer
*/
public void setSendToPrinter(boolean sendToPrinter) {
this.sendToPrinter = sendToPrinter;
}
public String getMediaTray() {
return mediaTray;
}
/**
* Sets MediaTray supported by the javax.print.DocFlavor API, for example upper,middle etc.
*/
public void setMediaTray(String mediaTray) {
this.mediaTray = mediaTray;
}
public String getPrinterPrefix() {
return printerPrefix;
}
/**
* Sets the prefix name of the printer, it is useful when the printer name does not start with //hostname/printer
*/
public void setPrinterPrefix(String printerPrefix) {
this.printerPrefix = printerPrefix;
}
}