1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski package com.sun.star.report.pentaho;
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski import com.sun.star.report.OutputRepository;
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski import java.io.IOException;
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski public class DefaultNameGenerator
31*b1cdbd2cSJim Jagielski {
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski     private final OutputRepository outputRepository;
34*b1cdbd2cSJim Jagielski 
DefaultNameGenerator(final OutputRepository outputRepository)35*b1cdbd2cSJim Jagielski     public DefaultNameGenerator(final OutputRepository outputRepository)
36*b1cdbd2cSJim Jagielski     {
37*b1cdbd2cSJim Jagielski         if (outputRepository == null)
38*b1cdbd2cSJim Jagielski         {
39*b1cdbd2cSJim Jagielski             throw new NullPointerException();
40*b1cdbd2cSJim Jagielski         }
41*b1cdbd2cSJim Jagielski         this.outputRepository = outputRepository;
42*b1cdbd2cSJim Jagielski     }
43*b1cdbd2cSJim Jagielski 
generateName(final String namePrefix, final String mimeType)44*b1cdbd2cSJim Jagielski     public String generateName(final String namePrefix, final String mimeType)
45*b1cdbd2cSJim Jagielski             throws IOException
46*b1cdbd2cSJim Jagielski     {
47*b1cdbd2cSJim Jagielski         return generateName(namePrefix, mimeType, true);
48*b1cdbd2cSJim Jagielski     }
49*b1cdbd2cSJim Jagielski 
generateStorageName(final String namePrefix, final String mimeType)50*b1cdbd2cSJim Jagielski     public String generateStorageName(final String namePrefix, final String mimeType)
51*b1cdbd2cSJim Jagielski             throws IOException
52*b1cdbd2cSJim Jagielski     {
53*b1cdbd2cSJim Jagielski         return generateName(namePrefix, mimeType, false);
54*b1cdbd2cSJim Jagielski     }
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski     /**
57*b1cdbd2cSJim Jagielski      * Generates a new, unique name for storing resources in the output repository. Assuming that proper synchronization
58*b1cdbd2cSJim Jagielski      * has been applied, the generated name will be unique within that repository.
59*b1cdbd2cSJim Jagielski      *
60*b1cdbd2cSJim Jagielski      * @param namePrefix a user defined name for that resource.
61*b1cdbd2cSJim Jagielski      * @param mimeType   the mime type of the resource to be stored in the repository.
62*b1cdbd2cSJim Jagielski      * @param isStream
63*b1cdbd2cSJim Jagielski      * @return the generated, fully qualified name.
64*b1cdbd2cSJim Jagielski      * @throws java.io.IOException
65*b1cdbd2cSJim Jagielski      */
generateName(final String namePrefix, final String mimeType, final boolean isStream)66*b1cdbd2cSJim Jagielski     private String generateName(final String namePrefix, final String mimeType, final boolean isStream)
67*b1cdbd2cSJim Jagielski             throws IOException
68*b1cdbd2cSJim Jagielski     {
69*b1cdbd2cSJim Jagielski         final String name;
70*b1cdbd2cSJim Jagielski         if (namePrefix != null)
71*b1cdbd2cSJim Jagielski         {
72*b1cdbd2cSJim Jagielski             name = namePrefix;
73*b1cdbd2cSJim Jagielski         }
74*b1cdbd2cSJim Jagielski         else
75*b1cdbd2cSJim Jagielski         {
76*b1cdbd2cSJim Jagielski             name = "file";
77*b1cdbd2cSJim Jagielski         }
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski         StringBuffer firstFileName = new StringBuffer();
80*b1cdbd2cSJim Jagielski         firstFileName.append(name);
81*b1cdbd2cSJim Jagielski         final String suffix;
82*b1cdbd2cSJim Jagielski         if (mimeType != null)
83*b1cdbd2cSJim Jagielski         {
84*b1cdbd2cSJim Jagielski             suffix = getSuffixForType(mimeType);
85*b1cdbd2cSJim Jagielski             firstFileName.append('.');
86*b1cdbd2cSJim Jagielski             firstFileName.append(suffix);
87*b1cdbd2cSJim Jagielski         }
88*b1cdbd2cSJim Jagielski         else
89*b1cdbd2cSJim Jagielski         {
90*b1cdbd2cSJim Jagielski             suffix = null;
91*b1cdbd2cSJim Jagielski         }
92*b1cdbd2cSJim Jagielski         String newName = firstFileName.toString();
93*b1cdbd2cSJim Jagielski         boolean exists;
94*b1cdbd2cSJim Jagielski         if (isStream)
95*b1cdbd2cSJim Jagielski         {
96*b1cdbd2cSJim Jagielski             exists = outputRepository.exists(newName);
97*b1cdbd2cSJim Jagielski         }
98*b1cdbd2cSJim Jagielski         else
99*b1cdbd2cSJim Jagielski         {
100*b1cdbd2cSJim Jagielski             exists = outputRepository.existsStorage(newName);
101*b1cdbd2cSJim Jagielski         }
102*b1cdbd2cSJim Jagielski         if (exists)
103*b1cdbd2cSJim Jagielski         {
104*b1cdbd2cSJim Jagielski             int counter = 0;
105*b1cdbd2cSJim Jagielski             while (exists)
106*b1cdbd2cSJim Jagielski             {
107*b1cdbd2cSJim Jagielski                 if (counter < 0) // wraparound should not happen..
108*b1cdbd2cSJim Jagielski                 {
109*b1cdbd2cSJim Jagielski                     throw new IOException();
110*b1cdbd2cSJim Jagielski                 }
111*b1cdbd2cSJim Jagielski                 firstFileName.delete(0, firstFileName.length());
112*b1cdbd2cSJim Jagielski                 firstFileName.append(name);
113*b1cdbd2cSJim Jagielski                 firstFileName.append(counter);
114*b1cdbd2cSJim Jagielski                 if (suffix != null)
115*b1cdbd2cSJim Jagielski                 {
116*b1cdbd2cSJim Jagielski                     firstFileName.append('.');
117*b1cdbd2cSJim Jagielski                     firstFileName.append(suffix);
118*b1cdbd2cSJim Jagielski                 }
119*b1cdbd2cSJim Jagielski                 newName = firstFileName.toString();
120*b1cdbd2cSJim Jagielski                 if (isStream)
121*b1cdbd2cSJim Jagielski                 {
122*b1cdbd2cSJim Jagielski                     exists = outputRepository.exists(newName);
123*b1cdbd2cSJim Jagielski                 }
124*b1cdbd2cSJim Jagielski                 else
125*b1cdbd2cSJim Jagielski                 {
126*b1cdbd2cSJim Jagielski                     exists = outputRepository.existsStorage(newName);
127*b1cdbd2cSJim Jagielski                 }
128*b1cdbd2cSJim Jagielski                 counter++;
129*b1cdbd2cSJim Jagielski             }
130*b1cdbd2cSJim Jagielski         }
131*b1cdbd2cSJim Jagielski         return newName;
132*b1cdbd2cSJim Jagielski     }
133*b1cdbd2cSJim Jagielski 
getSuffixForType(final String mimeType)134*b1cdbd2cSJim Jagielski     protected String getSuffixForType(final String mimeType)
135*b1cdbd2cSJim Jagielski     {
136*b1cdbd2cSJim Jagielski         if ("image/png".equals(mimeType))
137*b1cdbd2cSJim Jagielski         {
138*b1cdbd2cSJim Jagielski             return "png";
139*b1cdbd2cSJim Jagielski         }
140*b1cdbd2cSJim Jagielski         if ("image/jpeg".equals(mimeType))
141*b1cdbd2cSJim Jagielski         {
142*b1cdbd2cSJim Jagielski             return "jpg";
143*b1cdbd2cSJim Jagielski         }
144*b1cdbd2cSJim Jagielski         if ("image/gif".equals(mimeType))
145*b1cdbd2cSJim Jagielski         {
146*b1cdbd2cSJim Jagielski             return "gif";
147*b1cdbd2cSJim Jagielski         }
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski         // todo ... use a flexible mapping ...
150*b1cdbd2cSJim Jagielski         return "dat";
151*b1cdbd2cSJim Jagielski     }
152*b1cdbd2cSJim Jagielski }
153