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    }