001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.camel.component.printer;
018
019 import java.net.URI;
020 import java.net.URISyntaxException;
021 import java.util.Map;
022 import javax.print.DocFlavor;
023 import javax.print.attribute.standard.MediaSizeName;
024 import javax.print.attribute.standard.Sides;
025
026 import org.apache.camel.util.URISupport;
027 import org.apache.commons.logging.Log;
028 import org.apache.commons.logging.LogFactory;
029
030 public class PrinterConfiguration {
031 private static final transient Log LOG = LogFactory.getLog(PrinterConfiguration.class);
032 private URI uri;
033 private String hostname;
034 private int port;
035 private String printername;
036 private int copies = 1;
037 private String flavor;
038 private DocFlavor docFlavor;
039 private String mimeType;
040 private String mediaSize;
041 private MediaSizeName mediaSizeName;
042 private String sides;
043 private Sides internalSides;
044 private boolean sendToPrinter = true;
045
046 public PrinterConfiguration() {
047 }
048
049 public PrinterConfiguration(URI uri) throws URISyntaxException {
050 this.uri = uri;
051 }
052
053 public void parseURI(URI uri) throws Exception {
054 String protocol = uri.getScheme();
055
056 if (!protocol.equalsIgnoreCase("lpr")) {
057 throw new IllegalArgumentException("Unrecognized Print protocol: " + protocol + " for uri: " + uri);
058 }
059
060 setUri(uri);
061 setHostname(uri.getHost());
062 setPort(uri.getPort());
063 setPrintername(uri.getPath());
064
065 Map printSettings = URISupport.parseParameters(uri);
066 setFlavor((String)printSettings.get("flavor"));
067 setMimeType((String)printSettings.get("mimeType"));
068 setDocFlavor(assignDocFlavor(flavor, mimeType));
069
070 if (printSettings.containsKey("copies")) {
071 setCopies(Integer.valueOf((String) printSettings.get("copies")));
072 }
073 setMediaSize((String)printSettings.get("mediaSize"));
074 setSides((String)printSettings.get("sides"));
075 setMediaSizeName(assignMediaSize(mediaSize));
076 setInternalSides(assignSides(sides));
077 if (printSettings.containsKey("sendToPrinter")) {
078 if (!(Boolean.valueOf((String) printSettings.get("sendToPrinter")))) {
079 setSendToPrinter(false);
080 }
081 }
082 }
083
084 private DocFlavor assignDocFlavor(String flavor, String mimeType) throws Exception {
085 // defaults
086 if (mimeType == null) {
087 mimeType = "AUTOSENSE";
088 }
089 if (flavor == null) {
090 flavor = "DocFlavor.BYTE_ARRAY";
091 }
092
093 DocFlavor d = DocFlavor.BYTE_ARRAY.AUTOSENSE;
094 DocFlavorAssigner docFlavorAssigner = new DocFlavorAssigner();
095 if (mimeType.equalsIgnoreCase("AUTOSENSE")) {
096 d = docFlavorAssigner.forMimeTypeAUTOSENSE(flavor);
097 } else if (mimeType.equalsIgnoreCase("GIF")) {
098 d = docFlavorAssigner.forMimeTypeGIF(flavor);
099 } else if (mimeType.equalsIgnoreCase("JPEG")) {
100 d = docFlavorAssigner.forMimeTypeJPEG(flavor);
101 } else if (mimeType.equalsIgnoreCase("PDF")) {
102 d = docFlavorAssigner.forMimeTypePDF(flavor);
103 } else if (mimeType.equalsIgnoreCase("PCL")) {
104 d = docFlavorAssigner.forMimeTypePCL(flavor);
105 } else if (mimeType.equalsIgnoreCase("POSTSCRIPT")) {
106 d = docFlavorAssigner.forMimeTypePOSTSCRIPT(flavor);
107 } else if (mimeType.equalsIgnoreCase("TEXT_HTML_HOST")) {
108 d = docFlavorAssigner.forMimeTypeHOST(flavor, mimeType);
109 } else if (mimeType.equalsIgnoreCase("TEXT_HTML_US_ASCII")) {
110 d = docFlavorAssigner.forMimeTypeUSASCII(flavor, mimeType);
111 } else if (mimeType.equalsIgnoreCase("TEXT_HTML_UTF_16")) {
112 d = docFlavorAssigner.forMimeTypeUTF16(flavor, mimeType);
113 } else if (mimeType.equalsIgnoreCase("TEXT_HTML_UTF_16LE")) {
114 d = docFlavorAssigner.forMimeTypeUTF16LE(flavor, mimeType);
115 } else if (mimeType.equalsIgnoreCase("TEXT_HTML_UTF_16BE")) {
116 d = docFlavorAssigner.forMimeTypeUTF16BE(flavor, mimeType);
117 } else if (mimeType.equalsIgnoreCase("TEXT_HTML_UTF_8")) {
118 d = docFlavorAssigner.forMimeTypeUTF8(flavor, mimeType);
119 } else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_HOST")) {
120 d = docFlavorAssigner.forMimeTypeHOST(flavor, mimeType);
121 } else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_US_ASCII")) {
122 d = docFlavorAssigner.forMimeTypeUSASCII(flavor, mimeType);
123 } else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_UTF_16")) {
124 d = docFlavorAssigner.forMimeTypeUTF16(flavor, mimeType);
125 } else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_UTF_16LE")) {
126 d = docFlavorAssigner.forMimeTypeUTF16LE(flavor, mimeType);
127 } else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_UTF_16BE")) {
128 d = docFlavorAssigner.forMimeTypeUTF16BE(flavor, mimeType);
129 } else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_UTF_8")) {
130 d = docFlavorAssigner.forMimeTypeUTF8(flavor, mimeType);
131 } else if (mimeType.equalsIgnoreCase("TEXT_HTML")) {
132 d = docFlavorAssigner.forMimeTypeBasic(flavor, mimeType);
133 } else if (mimeType.equalsIgnoreCase("TEXT_PLAIN")) {
134 d = docFlavorAssigner.forMimeTypeBasic(flavor, mimeType);
135 } else if (mimeType.equalsIgnoreCase("PAGEABLE")) {
136 d = docFlavorAssigner.forMimeTypePAGEABLE(flavor);
137 } else if (mimeType.equalsIgnoreCase("PRINTABLE")) {
138 d = docFlavorAssigner.forMimeTypePRINTABLE(flavor);
139 } else if (mimeType.equalsIgnoreCase("RENDERABLE_IMAGE")) {
140 d = docFlavorAssigner.forMimeTypeRENDERABLEIMAGE(flavor);
141 }
142
143 return d;
144 }
145
146 private MediaSizeName assignMediaSize(String size) {
147 MediaSizeAssigner mediaSizeAssigner = new MediaSizeAssigner();
148
149 MediaSizeName answer;
150
151 if (size == null) {
152 // default to NA letter if no size configured
153 answer = MediaSizeName.NA_LETTER;
154 } else if (size.toLowerCase().startsWith("iso")) {
155 answer = mediaSizeAssigner.selectMediaSizeNameISO(size);
156 } else if (size.startsWith("jis")) {
157 answer = mediaSizeAssigner.selectMediaSizeNameJIS(size);
158 } else if (size.startsWith("na")) {
159 answer = mediaSizeAssigner.selectMediaSizeNameNA(size);
160 } else {
161 answer = mediaSizeAssigner.selectMediaSizeNameOther(size);
162 }
163
164 return answer;
165 }
166
167 public Sides assignSides(String sidesString) {
168 Sides answer;
169
170 if (sidesString == null) {
171 // default to one side if no slides configured
172 answer = Sides.ONE_SIDED;
173 } else if (sidesString.equalsIgnoreCase("one-sided")) {
174 answer = Sides.ONE_SIDED;
175 } else if (sidesString.equalsIgnoreCase("duplex")) {
176 answer = Sides.DUPLEX;
177 } else if (sidesString.equalsIgnoreCase("tumble")) {
178 answer = Sides.TUMBLE;
179 } else if (sidesString.equalsIgnoreCase("two-sided-short-edge")) {
180 answer = Sides.TWO_SIDED_SHORT_EDGE;
181 } else if (sidesString.equalsIgnoreCase("two-sided-long-edge")) {
182 answer = Sides.TWO_SIDED_LONG_EDGE;
183 } else {
184 answer = Sides.ONE_SIDED;
185 }
186
187 return answer;
188 }
189
190 public URI getUri() {
191 return uri;
192 }
193
194 public void setUri(URI uri) {
195 this.uri = uri;
196 }
197
198 public String getHostname() {
199 return hostname;
200 }
201
202 public void setHostname(String hostname) {
203 this.hostname = hostname;
204 }
205
206 public int getPort() {
207 return port;
208 }
209
210 public void setPort(int port) {
211 this.port = port;
212 }
213
214 public String getPrintername() {
215 return printername;
216 }
217
218 public void setPrintername(String printername) {
219 this.printername = printername;
220 }
221
222 public int getCopies() {
223 return copies;
224 }
225
226 public void setCopies(int copies) {
227 this.copies = copies;
228 }
229
230 public String getFlavor() {
231 return flavor;
232 }
233
234 public void setFlavor(String flavor) {
235 this.flavor = flavor;
236 }
237
238 public DocFlavor getDocFlavor() {
239 return docFlavor;
240 }
241
242 public void setDocFlavor(DocFlavor docFlavor) {
243 this.docFlavor = docFlavor;
244 }
245
246 public String getMediaSize() {
247 return mediaSize;
248 }
249
250 public void setMediaSize(String mediaSize) {
251 this.mediaSize = mediaSize;
252 }
253
254 public String getSides() {
255 return sides;
256 }
257
258 public void setSides(String sides) {
259 this.sides = sides;
260 }
261
262 public MediaSizeName getMediaSizeName() {
263 return mediaSizeName;
264 }
265
266 public void setMediaSizeName(MediaSizeName mediaSizeName) {
267 this.mediaSizeName = mediaSizeName;
268 }
269
270 public Sides getInternalSides() {
271 return internalSides;
272 }
273
274 public void setInternalSides(Sides internalSides) {
275 this.internalSides = internalSides;
276 }
277
278 public String getMimeType() {
279 return mimeType;
280 }
281
282 public void setMimeType(String mimeType) {
283 this.mimeType = mimeType;
284 }
285
286 public boolean isSendToPrinter() {
287 return sendToPrinter;
288 }
289
290 public void setSendToPrinter(boolean sendToPrinter) {
291 this.sendToPrinter = sendToPrinter;
292 }
293
294 }