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    }