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