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.slf4j.Logger;
028 import org.slf4j.LoggerFactory;
029
030 public class PrinterConfiguration {
031 private URI uri;
032 private String hostname;
033 private int port;
034 private String printername;
035 private int copies = 1;
036 private String flavor;
037 private DocFlavor docFlavor;
038 private String mimeType;
039 private String mediaSize;
040 private MediaSizeName mediaSizeName;
041 private String sides;
042 private Sides internalSides;
043 private boolean sendToPrinter = true;
044
045 public PrinterConfiguration() {
046 }
047
048 public PrinterConfiguration(URI uri) throws URISyntaxException {
049 this.uri = uri;
050 }
051
052 public void parseURI(URI uri) throws Exception {
053 String protocol = uri.getScheme();
054
055 if (!protocol.equalsIgnoreCase("lpr")) {
056 throw new IllegalArgumentException("Unrecognized Print protocol: " + protocol + " for uri: " + uri);
057 }
058
059 setUri(uri);
060 setHostname(uri.getHost());
061 setPort(uri.getPort());
062 setPrintername(uri.getPath());
063
064 Map printSettings = URISupport.parseParameters(uri);
065 setFlavor((String)printSettings.get("flavor"));
066 setMimeType((String)printSettings.get("mimeType"));
067 setDocFlavor(assignDocFlavor(flavor, mimeType));
068
069 if (printSettings.containsKey("copies")) {
070 setCopies(Integer.valueOf((String) printSettings.get("copies")));
071 }
072 setMediaSize((String)printSettings.get("mediaSize"));
073 setSides((String)printSettings.get("sides"));
074 setMediaSizeName(assignMediaSize(mediaSize));
075 setInternalSides(assignSides(sides));
076 if (printSettings.containsKey("sendToPrinter")) {
077 if (!(Boolean.valueOf((String) printSettings.get("sendToPrinter")))) {
078 setSendToPrinter(false);
079 }
080 }
081 }
082
083 private DocFlavor assignDocFlavor(String flavor, String mimeType) throws Exception {
084 // defaults
085 if (mimeType == null) {
086 mimeType = "AUTOSENSE";
087 }
088 if (flavor == null) {
089 flavor = "DocFlavor.BYTE_ARRAY";
090 }
091
092 DocFlavor d = DocFlavor.BYTE_ARRAY.AUTOSENSE;
093 DocFlavorAssigner docFlavorAssigner = new DocFlavorAssigner();
094 if (mimeType.equalsIgnoreCase("AUTOSENSE")) {
095 d = docFlavorAssigner.forMimeTypeAUTOSENSE(flavor);
096 } else if (mimeType.equalsIgnoreCase("GIF")) {
097 d = docFlavorAssigner.forMimeTypeGIF(flavor);
098 } else if (mimeType.equalsIgnoreCase("JPEG")) {
099 d = docFlavorAssigner.forMimeTypeJPEG(flavor);
100 } else if (mimeType.equalsIgnoreCase("PDF")) {
101 d = docFlavorAssigner.forMimeTypePDF(flavor);
102 } else if (mimeType.equalsIgnoreCase("PCL")) {
103 d = docFlavorAssigner.forMimeTypePCL(flavor);
104 } else if (mimeType.equalsIgnoreCase("POSTSCRIPT")) {
105 d = docFlavorAssigner.forMimeTypePOSTSCRIPT(flavor);
106 } else if (mimeType.equalsIgnoreCase("TEXT_HTML_HOST")) {
107 d = docFlavorAssigner.forMimeTypeHOST(flavor, mimeType);
108 } else if (mimeType.equalsIgnoreCase("TEXT_HTML_US_ASCII")) {
109 d = docFlavorAssigner.forMimeTypeUSASCII(flavor, mimeType);
110 } else if (mimeType.equalsIgnoreCase("TEXT_HTML_UTF_16")) {
111 d = docFlavorAssigner.forMimeTypeUTF16(flavor, mimeType);
112 } else if (mimeType.equalsIgnoreCase("TEXT_HTML_UTF_16LE")) {
113 d = docFlavorAssigner.forMimeTypeUTF16LE(flavor, mimeType);
114 } else if (mimeType.equalsIgnoreCase("TEXT_HTML_UTF_16BE")) {
115 d = docFlavorAssigner.forMimeTypeUTF16BE(flavor, mimeType);
116 } else if (mimeType.equalsIgnoreCase("TEXT_HTML_UTF_8")) {
117 d = docFlavorAssigner.forMimeTypeUTF8(flavor, mimeType);
118 } else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_HOST")) {
119 d = docFlavorAssigner.forMimeTypeHOST(flavor, mimeType);
120 } else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_US_ASCII")) {
121 d = docFlavorAssigner.forMimeTypeUSASCII(flavor, mimeType);
122 } else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_UTF_16")) {
123 d = docFlavorAssigner.forMimeTypeUTF16(flavor, mimeType);
124 } else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_UTF_16LE")) {
125 d = docFlavorAssigner.forMimeTypeUTF16LE(flavor, mimeType);
126 } else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_UTF_16BE")) {
127 d = docFlavorAssigner.forMimeTypeUTF16BE(flavor, mimeType);
128 } else if (mimeType.equalsIgnoreCase("TEXT_PLAIN_UTF_8")) {
129 d = docFlavorAssigner.forMimeTypeUTF8(flavor, mimeType);
130 } else if (mimeType.equalsIgnoreCase("TEXT_HTML")) {
131 d = docFlavorAssigner.forMimeTypeBasic(flavor, mimeType);
132 } else if (mimeType.equalsIgnoreCase("TEXT_PLAIN")) {
133 d = docFlavorAssigner.forMimeTypeBasic(flavor, mimeType);
134 } else if (mimeType.equalsIgnoreCase("PAGEABLE")) {
135 d = docFlavorAssigner.forMimeTypePAGEABLE(flavor);
136 } else if (mimeType.equalsIgnoreCase("PRINTABLE")) {
137 d = docFlavorAssigner.forMimeTypePRINTABLE(flavor);
138 } else if (mimeType.equalsIgnoreCase("RENDERABLE_IMAGE")) {
139 d = docFlavorAssigner.forMimeTypeRENDERABLEIMAGE(flavor);
140 }
141
142 return d;
143 }
144
145 private MediaSizeName assignMediaSize(String size) {
146 MediaSizeAssigner mediaSizeAssigner = new MediaSizeAssigner();
147
148 MediaSizeName answer;
149
150 if (size == null) {
151 // default to NA letter if no size configured
152 answer = MediaSizeName.NA_LETTER;
153 } else if (size.toLowerCase().startsWith("iso")) {
154 answer = mediaSizeAssigner.selectMediaSizeNameISO(size);
155 } else if (size.startsWith("jis")) {
156 answer = mediaSizeAssigner.selectMediaSizeNameJIS(size);
157 } else if (size.startsWith("na")) {
158 answer = mediaSizeAssigner.selectMediaSizeNameNA(size);
159 } else {
160 answer = mediaSizeAssigner.selectMediaSizeNameOther(size);
161 }
162
163 return answer;
164 }
165
166 public Sides assignSides(String sidesString) {
167 Sides answer;
168
169 if (sidesString == null) {
170 // default to one side if no slides configured
171 answer = Sides.ONE_SIDED;
172 } else if (sidesString.equalsIgnoreCase("one-sided")) {
173 answer = Sides.ONE_SIDED;
174 } else if (sidesString.equalsIgnoreCase("duplex")) {
175 answer = Sides.DUPLEX;
176 } else if (sidesString.equalsIgnoreCase("tumble")) {
177 answer = Sides.TUMBLE;
178 } else if (sidesString.equalsIgnoreCase("two-sided-short-edge")) {
179 answer = Sides.TWO_SIDED_SHORT_EDGE;
180 } else if (sidesString.equalsIgnoreCase("two-sided-long-edge")) {
181 answer = Sides.TWO_SIDED_LONG_EDGE;
182 } else {
183 answer = Sides.ONE_SIDED;
184 }
185
186 return answer;
187 }
188
189 public URI getUri() {
190 return uri;
191 }
192
193 public void setUri(URI uri) {
194 this.uri = uri;
195 }
196
197 public String getHostname() {
198 return hostname;
199 }
200
201 public void setHostname(String hostname) {
202 this.hostname = hostname;
203 }
204
205 public int getPort() {
206 return port;
207 }
208
209 public void setPort(int port) {
210 this.port = port;
211 }
212
213 public String getPrintername() {
214 return printername;
215 }
216
217 public void setPrintername(String printername) {
218 this.printername = printername;
219 }
220
221 public int getCopies() {
222 return copies;
223 }
224
225 public void setCopies(int copies) {
226 this.copies = copies;
227 }
228
229 public String getFlavor() {
230 return flavor;
231 }
232
233 public void setFlavor(String flavor) {
234 this.flavor = flavor;
235 }
236
237 public DocFlavor getDocFlavor() {
238 return docFlavor;
239 }
240
241 public void setDocFlavor(DocFlavor docFlavor) {
242 this.docFlavor = docFlavor;
243 }
244
245 public String getMediaSize() {
246 return mediaSize;
247 }
248
249 public void setMediaSize(String mediaSize) {
250 this.mediaSize = mediaSize;
251 }
252
253 public String getSides() {
254 return sides;
255 }
256
257 public void setSides(String sides) {
258 this.sides = sides;
259 }
260
261 public MediaSizeName getMediaSizeName() {
262 return mediaSizeName;
263 }
264
265 public void setMediaSizeName(MediaSizeName mediaSizeName) {
266 this.mediaSizeName = mediaSizeName;
267 }
268
269 public Sides getInternalSides() {
270 return internalSides;
271 }
272
273 public void setInternalSides(Sides internalSides) {
274 this.internalSides = internalSides;
275 }
276
277 public String getMimeType() {
278 return mimeType;
279 }
280
281 public void setMimeType(String mimeType) {
282 this.mimeType = mimeType;
283 }
284
285 public boolean isSendToPrinter() {
286 return sendToPrinter;
287 }
288
289 public void setSendToPrinter(boolean sendToPrinter) {
290 this.sendToPrinter = sendToPrinter;
291 }
292
293 }