Mir goes GPL
[mir.git] / source / mircoders / entity / EntityImages.java
1 /*
2  * Copyright (C) 2001, 2002  The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
6  * Mir is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Mir is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Mir; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  * In addition, as a special exception, The Mir-coders gives permission to link
21  * the code of this program with the com.oreilly.servlet library, any library
22  * licensed under the Apache Software License, The Sun (tm) Java Advanced
23  * Imaging library (JAI), The Sun JIMI library (or with modified versions of
24  * the above that use the same license as the above), and distribute linked
25  * combinations including the two.  You must obey the GNU General Public
26  * License in all respects for all of the code used other than the above
27  * mentioned libraries.  If you modify this file, you may extend this exception
28  * to your version of the file, but you are not obligated to do so.  If you do
29  * not wish to do so, delete this exception statement from your version.
30  */
31
32 package mircoders.entity;
33
34 import java.lang.*;
35 import java.io.*;
36 import java.util.*;
37 import java.sql.*;
38
39 /*
40  * kind of hack for postgres non-standard LargeObjects that Poolman
41  * doesn't know about. see all the casting, LargeObj stuff in getIcon, getImage
42  * at some point when postgres has normal BLOB support, this should go.
43  */
44 import org.postgresql.Connection;
45 import org.postgresql.largeobject.LargeObject;
46 import org.postgresql.largeobject.LargeObjectManager;
47
48 import mir.entity.*;
49 import mir.misc.*;
50 import mir.storage.*;
51
52 /**
53  * Diese Klasse enthält die Daten eines MetaObjekts
54  *
55  * @author RK
56  * @version 11.11.2000
57  */
58
59
60 public class EntityImages extends EntityUploadedMedia
61 {
62         public EntityImages()
63         {
64                 super();
65         }
66
67         public EntityImages(StorageObject theStorage) {
68                 this();
69                 setStorage(theStorage);
70         }
71
72         //
73         // methods
74
75
76
77         public byte[] getImage() throws StorageObjectException
78         {
79                 theLog.printDebugInfo("--getimage started");
80                 java.sql.Connection con=null;Statement stmt=null;
81                 byte[] img_data=null;
82
83                 try {
84                         con = theStorageObject.getPooledCon();
85                         con.setAutoCommit(false);
86                         LargeObjectManager lom;
87             java.sql.Connection jCon;
88             stmt = con.createStatement();
89                         ResultSet rs = theStorageObject.executeSql(stmt,
90                             "select image_data from images where id="+getId());
91             jCon = ((com.codestudio.sql.PoolManConnectionHandle)con)
92                     .getNativeConnection();
93             lom = ((org.postgresql.Connection)jCon).getLargeObjectAPI();
94                         if(rs!=null) {
95               if (rs.next()) {
96                 LargeObject lob = lom.open(rs.getInt(1));
97                 img_data = lob.read(lob.size());
98                 lob.close();
99                 //img_data = rs.getBytes(1);
100               }
101             rs.close();
102                         }
103                 } catch (Exception e) {
104           e.printStackTrace();
105           theLog.printError("EntityImages -- getImage failed"+e.toString()); 
106           throwStorageObjectException(e, "EntityImages -- getImage failed: ");
107         }
108         finally {
109           try {
110             con.setAutoCommit(true);
111           } catch (Exception e) {
112             e.printStackTrace();
113             theLog.printError(
114                     "EntityImages -- getImage reseting transaction mode failed"
115                     +e.toString()); 
116           }
117           theStorageObject.freeConnection(con,stmt);
118         }
119
120                 return img_data;
121         }
122
123         public void setImage(byte[] uploadData, String type)
124             throws StorageObjectException {
125
126                 if (uploadData!=null) {
127                         java.sql.Connection con=null;PreparedStatement pstmt=null;
128                         try {
129
130                                 theLog.printDebugInfo("settimage :: making internal representation of image");
131                                 WebdbImage webdbImage= new WebdbImage(uploadData, type);
132                                 theLog.printDebugInfo("settimage :: made internal representation of image");
133                                 byte[] imageData = webdbImage.getImage();
134                                 theLog.printDebugInfo("settimage :: getImage");
135                                 byte[] iconData = webdbImage.getIcon();
136                                 theLog.printDebugInfo("settimage :: getIcon");
137
138
139                                 if (iconData!=null && imageData!=null) {
140                                         con = theStorageObject.getPooledCon();
141                                         con.setAutoCommit(false);
142                                         theLog.printDebugInfo("settimage :: trying to insert image");
143
144                                         // setting values
145                     LargeObjectManager lom;
146                     java.sql.Connection jCon;
147                     jCon = ((com.codestudio.sql.PoolManConnectionHandle)con)
148                             .getNativeConnection();
149                     lom = ((org.postgresql.Connection)jCon).getLargeObjectAPI();
150                     int oidImage = lom.create();
151                     int oidIcon = lom.create();
152                     LargeObject lobImage = lom.open(oidImage);
153                     LargeObject lobIcon = lom.open(oidIcon);
154                     lobImage.write(imageData);
155                     lobIcon.write(iconData);
156                     lobImage.close();
157                     lobIcon.close();
158                     String sql = "update images set img_height='"
159                         +webdbImage.getImageHeight() +
160                                                 "',img_width='"   + webdbImage.getImageWidth() +
161                                                 "',icon_height='" + webdbImage.getIconHeight() +
162                                                 "',icon_width='"  + webdbImage.getIconWidth()
163                         +  "', image_data="+oidImage+", icon_data="+oidIcon
164                         +" where id="+getId();
165                                         theLog.printDebugInfo("settimage :: updating sizes: "+ sql);
166                                         pstmt = con.prepareStatement(sql);
167                                         //pstmt.setBytes(1, imageData);
168                                         //pstmt.setBytes(2, iconData);
169                                         pstmt.executeUpdate();
170                                         sql="update content set is_produced='0' where to_media="+getId();
171                                         pstmt = con.prepareStatement(sql);
172                                         pstmt.executeUpdate();
173                                 }
174                         }
175                         catch (Exception e) {throwStorageObjectException(e, "settimage :: setImage gescheitert: ");}
176                         finally {
177                                 try { if (con!=null) con.setAutoCommit(true); } catch (Exception e) {;}
178                                 theStorageObject.freeConnection(con,pstmt); }
179                 }
180         }
181
182         public void update() throws StorageObjectException {
183                 super.update();
184                 try {
185                         theStorageObject.executeUpdate("update content set is_produced='0' where to_media="+getId());
186                 } catch (SQLException e) {
187                         throwStorageObjectException(e, "EntityImages :: update :: failed!! ");
188                 }
189         }
190
191         public void setValues(HashMap theStringValues)
192         {
193                 if (theStringValues != null) {
194                         if (!theStringValues.containsKey("is_published"))
195                          theStringValues.put("is_published","0");
196                 }
197                 super.setValues(theStringValues);
198         }
199
200         public byte[] getIcon() throws StorageObjectException
201         {
202                 java.sql.Connection con=null;Statement stmt=null;
203                 byte[] img_data=null;
204
205                 try {
206                         con = theStorageObject.getPooledCon();
207                         con.setAutoCommit(false);
208             LargeObjectManager lom;
209             java.sql.Connection jCon;
210                         stmt = con.createStatement();
211                         ResultSet rs = theStorageObject.executeSql(stmt,
212                             "select icon_data from images where id="+getId());
213             jCon = ((com.codestudio.sql.PoolManConnectionHandle)con)
214                     .getNativeConnection();
215             lom = ((org.postgresql.Connection)jCon).getLargeObjectAPI();
216                         if(rs!=null) {
217                                 if (rs.next()) {
218                   LargeObject lob = lom.open(rs.getInt(1));
219                   img_data = lob.read(lob.size());
220                   lob.close();
221                   //img_data = rs.getBytes(1);
222                                 }
223                 rs.close();
224                         }
225                 } catch (Exception e) {
226           e.printStackTrace();
227           theLog.printError("EntityImages -- getIcon failed"+e.toString()); 
228           throwStorageObjectException(e, "EntityImages -- getIcon failed:");
229                 } finally {
230           try {
231             con.setAutoCommit(true);
232           } catch (Exception e) {
233             e.printStackTrace();
234             theLog.printError(
235                     "EntityImages -- getIcon reseting transaction mode failed"
236                     +e.toString()); 
237           }
238           theStorageObject.freeConnection(con,stmt);
239        }
240
241        return img_data;
242         }
243
244 }