media in comments, part 1: the admin side
authorzapata <zapata>
Thu, 10 Apr 2003 03:31:46 +0000 (03:31 +0000)
committerzapata <zapata>
Thu, 10 Apr 2003 03:31:46 +0000 (03:31 +0000)
21 files changed:
dbscripts/create_pg.sql
dbscripts/updates/update20030409.sql [new file with mode: 0755]
source/mircoders/entity/EntityComment.java
source/mircoders/entity/EntityContent.java
source/mircoders/entity/EntityUploadedMedia.java
source/mircoders/localizer/basic/MirBasicDataModelLocalizer.java
source/mircoders/servlet/ServletModuleComment.java
source/mircoders/servlet/ServletModuleContent.java
source/mircoders/servlet/ServletModuleOpenIndy.java
source/mircoders/servlet/ServletModuleUploadedMedia.java
source/mircoders/storage/DatabaseComment.java
source/mircoders/storage/DatabaseCommentToMedia.java [new file with mode: 0755]
templates/admin/FUNCTIONS.template
templates/admin/FUNCTIONS_media.template
templates/admin/audio.template
templates/admin/comment.template
templates/admin/content.template
templates/admin/image.template
templates/admin/imagelist.template
templates/admin/media.template
templates/admin/video.template

index 41cd7cc..1e331c3 100755 (executable)
@@ -155,8 +155,8 @@ CREATE TABLE "img_color" (
 
 -- language
 
-CREATE SEQUENCE "language_id_seq" start 1 increment 1 maxvalue 2147483647 minvalue 1 cache 1 ;\r
-\r
+CREATE SEQUENCE "language_id_seq" start 1 increment 1 maxvalue 2147483647 minvalue 1 cache 1 ;
+
 CREATE TABLE "language" (
        "id" integer DEFAULT nextval('language_id_seq') NOT NULL,
   "name" character varying(40) NOT NULL,
@@ -220,13 +220,13 @@ CREATE TABLE "content_x_topic" (
 
 -- article type
 
-CREATE SEQUENCE "article_type_id_seq" start 1 increment 1 maxvalue 2147483647 minvalue 1 cache 1 ;\r
-\r
+CREATE SEQUENCE "article_type_id_seq" start 1 increment 1 maxvalue 2147483647 minvalue 1 cache 1 ;
+
 CREATE TABLE "article_type" (
        "id" integer DEFAULT nextval('article_type_id_seq') NOT NULL,
        "name" character varying(40) NOT NULL,
        CONSTRAINT "article_type_pkey" PRIMARY KEY ("id")
-);\r
+);
 
 --
 -- TOC Entry ID 24 (OID 20183)
@@ -261,6 +261,7 @@ CREATE TABLE "comment" (
        "address" character varying(80),
        "phone" character varying(20),
        "webdb_create" timestamp with time zone NOT NULL,
+       "webdb_lastchange" timestamp with time zone,
        "is_published" boolean DEFAULT '1' NOT NULL,
        "to_language" integer DEFAULT '0' NOT NULL,
        "to_media" integer NOT NULL,
@@ -387,14 +388,14 @@ CREATE TABLE "messages" (
 
 -- comment_status
 
-CREATE SEQUENCE "comment_status_id_seq" start 1 increment 1 maxvalue 2147483647 minvalue 1 cache 1 ;\r
-\r
+CREATE SEQUENCE "comment_status_id_seq" start 1 increment 1 maxvalue 2147483647 minvalue 1 cache 1 ;
+
 CREATE TABLE "comment_status" (
   "id" integer DEFAULT nextval('comment_status_id_seq') NOT NULL,
   "name" character varying(40) NOT NULL,
   CONSTRAINT "comment_status_pkey" PRIMARY KEY ("id")
 );
-\r
+
 
 --
 -- TOC Entry ID 33 (OID 20588)
@@ -697,3 +698,10 @@ CREATE  INDEX "idx_comment_tomedia_ispublished" on "comment" using btree ( "to_m
 
 CREATE UNIQUE INDEX "idx_comment_id" on "comment" using btree ( "id" "int4_ops" );
 
+CREATE TABLE "comment_x_media" (
+   "comment_id" integer,
+   "media_id" integer
+);
+
+CREATE UNIQUE INDEX idx_comment_media on comment_x_media (comment_id, media_id);
+CREATE UNIQUE INDEX idx_media_comment on comment_x_media (media_id, comment_id);
diff --git a/dbscripts/updates/update20030409.sql b/dbscripts/updates/update20030409.sql
new file mode 100755 (executable)
index 0000000..366dfbc
--- /dev/null
@@ -0,0 +1,100 @@
+-- update script 2002-12-12 by Zapata
+-- * creates table comment_x_media, to support media in comments
+-- * adds webdb_lastchange to comment
+-- This script will the second time this script is run,
+--   so running this script when it isn't needed can't do any harm.
+--
+-- IMPORTANT: after running this script, run the update_all_sequences script as well
+
+BEGIN TRANSACTION;
+
+-- task 1: comment_x_media
+
+CREATE TABLE comment_x_media (
+  comment_id integer,
+  media_id integer
+);
+
+CREATE UNIQUE INDEX idx_comment_media on comment_x_media (comment_id, media_id);
+CREATE UNIQUE INDEX idx_media_comment on comment_x_media (media_id, comment_id);
+
+-- task 2: add webdb_lastchange to table comment
+  
+  ALTER TABLE "comment" RENAME TO "comment_old";
+  DROP INDEX comment_pkey;
+  
+  CREATE TABLE "comment" (
+    "id" integer DEFAULT nextval('comment_id_seq') NOT NULL,
+    "title" character varying(80) NOT NULL,
+    "creator" character varying(80) NOT NULL,
+    "description" text NOT NULL,
+    "main_url" character varying(255),
+    "email" character varying(80),
+    "address" character varying(80),
+    "phone" character varying(20),
+    "webdb_create" timestamp with time zone NOT NULL,
+    "webdb_lastchange" timestamp with time zone,
+    "is_published" boolean DEFAULT '1' NOT NULL,
+    "to_language" integer DEFAULT '0' NOT NULL,
+    "to_media" integer NOT NULL,
+    "to_comment_status" smallint,
+    "checksum" integer,
+    "is_html" boolean DEFAULT '0' NOT NULL,
+    Constraint "comment_pkey" Primary Key ("id")
+  );
+  
+  INSERT INTO "comment" (
+    "id", 
+    "title", 
+    "creator",
+    "description",
+    "main_url",
+    "email",
+    "address",
+    "phone",
+    "webdb_create",
+    "webdb_lastchange",
+    "is_published",
+    "to_language",
+    "to_media",
+    "to_comment_status",
+    "checksum",
+    "is_html"
+  )
+  SELECT
+    "id", 
+    "title", 
+    "creator",
+    "description",
+    "main_url",
+    "email",
+    "address",
+    "phone",
+    "webdb_create",
+    "webdb_create",
+    "is_published",
+    "to_language",
+    "to_media",
+    "to_comment_status",
+    "checksum",
+    "is_html" 
+  FROM "comment_old";
+
+  UPDATE  pg_class
+  SET
+    relowner = (SELECT relowner FROM pg_class WHERE relname='comment_old'),
+    relacl =   (SELECT relacl FROM pg_class WHERE relname='comment_old')
+  WHERE 
+    relname = 'comment';
+  
+  DROP TABLE "comment_old";
+
+  CREATE  INDEX "comment_checksum_index" on "comment" using btree ( "checksum" "int4_ops" );
+  CREATE  INDEX "idx_comment_to_media" on "comment" using btree ( "to_media" "int4_ops" );
+  create index idx_comment_webdb_create on comment(webdb_create);
+  CREATE  INDEX "idx_comment_tomedia_ispublished" on "comment" using btree ( "to_media" "int4_ops", "is_published" "bool_ops" );
+  CREATE UNIQUE INDEX "idx_comment_id" on "comment" using btree ( "id" "int4_ops" );
+  
+-- that's it!
+  
+COMMIT TRANSACTION;
index cfec128..bf4283f 100755 (executable)
-/*
- * Copyright (C) 2001, 2002  The Mir-coders group
- *
- * This file is part of Mir.
- *
- * Mir is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * Mir is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mir; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * In addition, as a special exception, The Mir-coders gives permission to link
- * the code of this program with the com.oreilly.servlet library, any library
- * licensed under the Apache Software License, The Sun (tm) Java Advanced
- * Imaging library (JAI), The Sun JIMI library (or with modified versions of
- * the above that use the same license as the above), and distribute linked
- * combinations including the two.  You must obey the GNU General Public
- * License in all respects for all of the code used other than the above
- * mentioned libraries.  If you modify this file, you may extend this exception
- * to your version of the file, but you are not obligated to do so.  If you do
- * not wish to do so, delete this exception statement from your version.
- */
-
-package mircoders.entity;
-
-import java.util.Map;
-
-import mir.entity.Entity;
-import mir.storage.StorageObject;
-
-/**
- * This class maps one line of the comment-table to a java-object.
- *
- * @author $Author: zapata $
- * @version $Revision: 1.14 $ $Date: 2003/03/04 22:00:52 $
- */
-
-
-public class EntityComment extends Entity
-{
-
-  public EntityComment()
-  {
-    super();
-  }
-
-  public EntityComment(StorageObject theStorage) {
-    this();
-    setStorage(theStorage);
-  }
-
-
-  /**
-   * overridden method setValues to patch creator_main_url
-   */
-  public void setValues(Map theStringValues)
-  {
-    if (theStringValues != null) {
-      if (!theStringValues.containsKey("is_published")) {
-        theStringValues.put("is_published","0");
-      }
-
-      if (theStringValues.containsKey("main_url")){
-        if (((String)theStringValues.get("main_url")).equalsIgnoreCase("http://")) {
-          theStringValues.remove("main_url");
-        }
-        else if ((!((String)theStringValues.get("main_url")).startsWith("http://"))
-                     && ((String)theStringValues.get("main_url")).length()>0) {
-            theStringValues.put("main_url","http://"+((String)theStringValues.get("main_url")));
-        }
-      }
-
-    }
-    super.setValues(theStringValues);
-  }
-}
+/*\r
+ * Copyright (C) 2001, 2002  The Mir-coders group\r
+ *\r
+ * This file is part of Mir.\r
+ *\r
+ * Mir is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * Mir is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with Mir; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ *\r
+ * In addition, as a special exception, The Mir-coders gives permission to link\r
+ * the code of this program with the com.oreilly.servlet library, any library\r
+ * licensed under the Apache Software License, The Sun (tm) Java Advanced\r
+ * Imaging library (JAI), The Sun JIMI library (or with modified versions of\r
+ * the above that use the same license as the above), and distribute linked\r
+ * combinations including the two.  You must obey the GNU General Public\r
+ * License in all respects for all of the code used other than the above\r
+ * mentioned libraries.  If you modify this file, you may extend this exception\r
+ * to your version of the file, but you are not obligated to do so.  If you do\r
+ * not wish to do so, delete this exception statement from your version.\r
+ */\r
+\r
+package mircoders.entity;\r
+\r
+import java.util.Map;\r
+\r
+import mir.entity.Entity;\r
+import mir.storage.StorageObject;\r
+import mir.storage.StorageObjectFailure;\r
+import mircoders.storage.DatabaseCommentToMedia;\r
+import mircoders.storage.DatabaseContent;\r
+\r
+/**\r
+ * This class maps one line of the comment-table to a java-object.\r
+ *\r
+ * @author $Author: zapata $\r
+ * @version $Revision: 1.15 $ $Date: 2003/04/10 03:31:46 $\r
+ */\r
+\r
+\r
+public class EntityComment extends Entity\r
+{\r
+\r
+  public EntityComment()\r
+  {\r
+    super();\r
+  }\r
+\r
+  public EntityComment(StorageObject theStorage) {\r
+    this();\r
+    setStorage(theStorage);\r
+  }\r
+\r
+\r
+  /**\r
+   * overridden method setValues to patch creator_main_url\r
+   */\r
+  public void setValues(Map theStringValues)\r
+  {\r
+    if (theStringValues != null) {\r
+      if (!theStringValues.containsKey("is_published")) {\r
+        theStringValues.put("is_published","0");\r
+      }\r
+\r
+      if (theStringValues.containsKey("main_url")){\r
+        if (((String)theStringValues.get("main_url")).equalsIgnoreCase("http://")) {\r
+          theStringValues.remove("main_url");\r
+        }\r
+        else if ((!((String)theStringValues.get("main_url")).startsWith("http://"))\r
+                     && ((String)theStringValues.get("main_url")).length()>0) {\r
+            theStringValues.put("main_url","http://"+((String)theStringValues.get("main_url")));\r
+        }\r
+      }\r
+\r
+    }\r
+    super.setValues(theStringValues);\r
+  }\r
+\r
+  /**\r
+   * Deattaches media from a comment\r
+   *\r
+   * @param aCommentId\r
+   * @param aMediaId\r
+   * @throws StorageObjectFailure\r
+   */\r
+  public void dettach(String aCommentId,String aMediaId) throws StorageObjectFailure\r
+  {\r
+    if (aMediaId!=null){\r
+      try{\r
+        DatabaseCommentToMedia.getInstance().delete(aCommentId, aMediaId);\r
+      }\r
+      catch (Exception e){\r
+        throwStorageObjectFailure(e, "dettach: failed to get instance");\r
+      }\r
+\r
+      DatabaseContent.getInstance().setUnproduced("id="+getValue("to_media"));\r
+    }\r
+  }\r
+\r
+  /**\r
+   *\r
+   * @param aMediaId\r
+   * @throws StorageObjectFailure\r
+   */\r
+\r
+  public void attach(String aMediaId) throws StorageObjectFailure\r
+  {\r
+    if (aMediaId!=null) {\r
+      try{\r
+        DatabaseCommentToMedia.getInstance().addMedia(getId(), aMediaId);\r
+      }\r
+      catch(StorageObjectFailure e){\r
+        throwStorageObjectFailure(e, "attach: could not get the instance");\r
+      }\r
+\r
+      DatabaseContent.getInstance().setUnproduced("id="+getValue("to_media"));\r
+    }\r
+    else {\r
+      logger.error("EntityContent: attach without mid");\r
+    }\r
+  }\r
+}\r
index 3e6bbb3..46bc838 100755 (executable)
@@ -54,7 +54,7 @@ import freemarker.template.TemplateModelException;
  * this class implements mapping of one line of the database table content
  * to a java object
  *
- * @version $Id: EntityContent.java,v 1.17 2003/03/05 19:23:15 idfx Exp $
+ * @version $Id: EntityContent.java,v 1.18 2003/04/10 03:31:47 zapata Exp $
  * @author mir-coders group
  *
  */
@@ -85,6 +85,7 @@ public class EntityContent extends Entity
 
   public EntityContent(StorageObject theStorage) {
     this();
+
     setStorage(theStorage);
   }
 
@@ -119,56 +120,43 @@ public class EntityContent extends Entity
     }
   }
 
-
-  /**
-   * make openposting to newswire
-   */
-
-  public void newswire() throws StorageObjectFailure
-  {
-    String sql = "update content set to_article_type='1', is_produced='0' where id='" + getId()+"'";
-    try {
-      theStorageObject.executeUpdate(sql);
-    } catch (StorageObjectFailure e) {
-      throwStorageObjectFailure(e, "\n -- newswire failed");
-    } catch (SQLException e) {
-      throwStorageObjectFailure(e, "\n -- newswire failed");
-    }
-  }
-
-
   /**
-   * dettach from media
+   * Deattaches media from an article
+   *
+   * @param anArticleId
+   * @param aMediaId
+   * @throws StorageObjectFailure
    */
-  public void dettach(String cid,String mid) throws StorageObjectFailure
+  public void dettach(String anArticleId, String aMediaId) throws StorageObjectFailure
   {
-    if (mid!=null){
+    if (aMediaId!=null){
       try{
-        DatabaseContentToMedia.getInstance().delete(cid,mid);
+        DatabaseContentToMedia.getInstance().delete(anArticleId, aMediaId);
       }
       catch (Exception e){
         throwStorageObjectFailure(e, "\n -- failed to get instance");
       }
 
-      //set Content to unproduced
       setProduced(false);
     }
   }
 
   /**
-   * attach to media
+   * Attaches media to an article
+   *
+   * @param mid
+   * @throws StorageObjectFailure
    */
 
-  public void attach(String mid) throws StorageObjectFailure
+  public void attach(String aMediaId) throws StorageObjectFailure
   {
-    if (mid!=null) {
-      //write media-id mid and content-id in table content_x_media
+    if (aMediaId!=null) {
       try{
-        DatabaseContentToMedia.getInstance().addMedia(getId(),mid);
-      } catch(StorageObjectFailure e){
+        DatabaseContentToMedia.getInstance().addMedia(getId(),aMediaId);
+      }
+      catch(StorageObjectFailure e){
         throwStorageObjectFailure(e, "attach: could not get the instance");
       }
-      //set Content to unproduced
       setProduced(false);
     }
     else {
index ecff925..13e34d8 100755 (executable)
 
 package mircoders.entity;
 
-import java.util.Map;
-import java.sql.SQLException;
-
-import freemarker.template.SimpleList;
-import freemarker.template.SimpleScalar;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-
-import mir.entity.Entity;
-import mir.entity.EntityList;
-import mir.log.LoggerWrapper;
-import mir.media.MediaHelper;
-import mir.media.MirMedia;
-import mir.misc.NumberUtils;
-import mir.storage.StorageObject;
-import mir.storage.StorageObjectFailure;
-import mircoders.storage.DatabaseContentToMedia;
+import java.sql.SQLException;\r
+import java.util.Map;\r
+\r
+import freemarker.template.SimpleList;\r
+import freemarker.template.SimpleScalar;\r
+import freemarker.template.TemplateModel;\r
+import freemarker.template.TemplateModelException;\r
+import mir.entity.Entity;\r
+import mir.log.LoggerWrapper;\r
+import mir.media.MediaHelper;\r
+import mir.media.MirMedia;\r
+import mir.misc.NumberUtils;\r
+import mir.storage.StorageObject;\r
+import mir.storage.StorageObjectFailure;\r
 import mircoders.storage.DatabaseUploadedMedia;
 
 /**
  *
  * @author mh, mir-coders group
- * @version $Id: EntityUploadedMedia.java,v 1.24 2003/03/16 19:54:45 zapata Exp $
+ * @version $Id: EntityUploadedMedia.java,v 1.25 2003/04/10 03:31:47 zapata Exp $
  */
 
 
index 859da23..e7d7857 100755 (executable)
@@ -97,11 +97,16 @@ public class MirBasicDataModelLocalizer implements MirDataModelLocalizer {
       anEntityAdapterDefinition.addCalculatedField("commentcount", new ContentCommentCountField(" and is_published='1'"));
       anEntityAdapterDefinition.addCalculatedField("fullcommentcount", new ContentCommentCountField(""));
 
-      anEntityAdapterDefinition.addCalculatedField("to_media_images",  new ContentToMediaField( "image" ));
       anEntityAdapterDefinition.addCalculatedField("to_uploaded_media", new ContentToMediaField( "uploadedMedia" ));
+      anEntityAdapterDefinition.addCalculatedField("to_media_images",  new ContentToMediaField( "image" ));
       anEntityAdapterDefinition.addCalculatedField("to_media_audio", new ContentToMediaField( "audio" ));
       anEntityAdapterDefinition.addCalculatedField("to_media_video", new ContentToMediaField( "video" ));
       anEntityAdapterDefinition.addCalculatedField("to_media_other", new ContentToMediaField( "otherMedia" ));
+      anEntityAdapterDefinition.addCalculatedField("to_all_uploaded_media", new ContentToMediaField( "uploadedMedia", false));
+      anEntityAdapterDefinition.addCalculatedField("to_all_media_images",  new ContentToMediaField( "image", false));
+      anEntityAdapterDefinition.addCalculatedField("to_all_media_audio", new ContentToMediaField( "audio", false));
+      anEntityAdapterDefinition.addCalculatedField("to_all_media_video", new ContentToMediaField( "video", false));
+      anEntityAdapterDefinition.addCalculatedField("to_all_media_other", new ContentToMediaField( "otherMedia", false));
       anEntityAdapterDefinition.addCalculatedField("to_media_icon", new ContentToIconField());
 
       anEntityAdapterDefinition.addCalculatedField("article_type", new ContentToArticleTypeField());
@@ -126,6 +131,17 @@ public class MirBasicDataModelLocalizer implements MirDataModelLocalizer {
       anEntityAdapterDefinition.addCalculatedField("to_content", new CommentToContentField());
       anEntityAdapterDefinition.addCalculatedField("status", new CommentToStatusField());
 
+      anEntityAdapterDefinition.addCalculatedField("to_uploaded_media", new CommentToMediaField( "uploadedMedia" ));
+      anEntityAdapterDefinition.addCalculatedField("to_media_images",  new CommentToMediaField( "image" ));
+      anEntityAdapterDefinition.addCalculatedField("to_media_audio", new CommentToMediaField( "audio" ));
+      anEntityAdapterDefinition.addCalculatedField("to_media_video", new CommentToMediaField( "video" ));
+      anEntityAdapterDefinition.addCalculatedField("to_media_other", new CommentToMediaField( "otherMedia" ));
+      anEntityAdapterDefinition.addCalculatedField("to_all_uploaded_media", new CommentToMediaField( "uploadedMedia", false));
+      anEntityAdapterDefinition.addCalculatedField("to_all_media_images",  new CommentToMediaField( "image", false));
+      anEntityAdapterDefinition.addCalculatedField("to_all_media_audio", new CommentToMediaField( "audio", false));
+      anEntityAdapterDefinition.addCalculatedField("to_all_media_video", new CommentToMediaField( "video", false));
+      anEntityAdapterDefinition.addCalculatedField("to_all_media_other", new CommentToMediaField( "otherMedia", false));
+
       anEntityAdapterDefinition.addCalculatedField("description_parsed", new FilteredField("description"));
       anEntityAdapterDefinition.addCalculatedField("operations",
           new EntityToSimpleOperationsField(MirGlobal.localizer().adminInterface().simpleCommentOperations()));
@@ -342,16 +358,54 @@ public class MirBasicDataModelLocalizer implements MirDataModelLocalizer {
   }
 
   protected class ContentToMediaField implements EntityAdapterDefinition.CalculatedField {
-    String definition;
+    private String definition;
+    private boolean published;
+
+    public ContentToMediaField(String aDefinition, boolean anOnlyPublished) {
+      definition = aDefinition;
+      published = anOnlyPublished;
+    }
 
     public ContentToMediaField(String aDefinition) {
+      this(aDefinition, true);
+    }
+
+    public Object getValue(EntityAdapter anEntityAdapter) {
+      try {
+        String condition = "exists (select * from content_x_media where content_id="+anEntityAdapter.get("id")+" and media_id=id)";
+        if (published)
+          condition = "is_published='t' and " + condition;
+        return anEntityAdapter.getRelation(
+           condition,
+          "id",
+          definition);
+      }
+      catch (Throwable t) {
+        throw new RuntimeException(t.getMessage());
+      }
+    }
+  }
+
+  protected class CommentToMediaField implements EntityAdapterDefinition.CalculatedField {
+    private String definition;
+    private boolean published;
+
+    public CommentToMediaField(String aDefinition, boolean anOnlyPublished) {
       definition = aDefinition;
+      published = anOnlyPublished;
+    }
+
+    public CommentToMediaField(String aDefinition) {
+      this(aDefinition, true);
     }
 
     public Object getValue(EntityAdapter anEntityAdapter) {
       try {
+        String condition = "exists (select * from comment_x_media where comment_id="+anEntityAdapter.get("id")+" and media_id=id)";
+        if (published)
+          condition = "is_published='t' and " + condition;
         return anEntityAdapter.getRelation(
-          "is_published='t' and exists (select * from content_x_media where content_id="+anEntityAdapter.get("id")+" and media_id=id)",
+           condition,
           "id",
           definition);
       }
index 5017347..7fb3b81 100755 (executable)
-/*
- * Copyright (C) 2001, 2002  The Mir-coders group
- *
- * This file is part of Mir.
- *
- * Mir is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * Mir is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mir; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * In addition, as a special exception, The Mir-coders gives permission to link
- * the code of this program with the com.oreilly.servlet library, any library
- * licensed under the Apache Software License, The Sun (tm) Java Advanced
- * Imaging library (JAI), The Sun JIMI library (or with modified versions of
- * the above that use the same license as the above), and distribute linked
- * combinations including the two.  You must obey the GNU General Public
- * License in all respects for all of the code used other than the above
- * mentioned libraries.  If you modify this file, you may extend this exception
- * to your version of the file, but you are not obligated to do so.  If you do
- * not wish to do so, delete this exception statement from your version.
- */
-
-package mircoders.servlet;
-
-import java.util.Map;
-import java.util.Locale;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import mir.config.MirPropertiesConfiguration;
-import mir.entity.adapter.EntityAdapterModel;
-import mir.entity.adapter.EntityIteratorAdapter;
-import mir.log.LoggerWrapper;
-import mir.servlet.ServletModule;
-import mir.servlet.ServletModuleExc;
-import mir.servlet.ServletModuleFailure;
-import mir.util.CachingRewindableIterator;
-import mir.util.HTTPRequestParser;
-import mir.util.JDBCStringRoutines;
-import mir.util.SQLQueryBuilder;
-import mir.util.URLBuilder;
-import mircoders.global.MirGlobal;
-import mircoders.module.ModuleComment;
-import mircoders.module.ModuleContent;
-import mircoders.storage.DatabaseComment;
-import mircoders.storage.DatabaseCommentStatus;
-import mircoders.storage.DatabaseContent;
-import mircoders.storage.DatabaseLanguage;
-import freemarker.template.SimpleHash;
-import freemarker.template.TemplateModelRoot;
-
-/*
- *  ServletModuleComment - controls navigation for Comments
- *
- *
- * @author RK
- */
-
-public class ServletModuleComment extends ServletModule
-{
-
-  private ModuleContent     moduleContent;
-
-  // Singelton / Kontruktor
-  private static ServletModuleComment instance = new ServletModuleComment();
-  public static ServletModule getInstance() { return instance; }
-
-  private ServletModuleComment() {
-    logger = new LoggerWrapper("ServletModule.Comment");
-
-
-    try {
-      configuration = MirPropertiesConfiguration.instance();
-      templateListString = configuration.getString("ServletModule.Comment.ListTemplate");
-      templateObjektString = configuration.getString("ServletModule.Comment.ObjektTemplate");
-      templateConfirmString = configuration.getString("ServletModule.Comment.ConfirmTemplate");
-
-      mainModule = new ModuleComment(DatabaseComment.getInstance());
-      moduleContent = new ModuleContent(DatabaseContent.getInstance());
-    }
-    catch (Exception e) {
-      logger.error("servletmodule comment could not be initialized:" + e.getMessage());
-    }
-  }
-
-  public void edit(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc
-  {
-    String idParam = req.getParameter("id");
-
-    if (idParam == null)
-      throw new ServletModuleExc("Invalid call: id not supplied ");
-
-    showComment(idParam, req, res);
-  }
-
-  public void showComment(String anId, HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {
-    try {
-      SimpleHash extraInfo = new SimpleHash();
-      TemplateModelRoot data;
-
-      data = (TemplateModelRoot) mainModule.getById(anId);
-
-      extraInfo.put("languages", DatabaseLanguage.getInstance().getPopupData());
-      extraInfo.put("comment_status_values", DatabaseCommentStatus.getInstance().getPopupData());
-
-      deliver(aRequest, aResponse, data, extraInfo, templateObjektString);
-    }
-    catch (Throwable e) {
-      throw new ServletModuleFailure(e);
-    }
-  }
-
-
-  public void list(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
-  {
-    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
-
-    String where = requestParser.getParameter("where");
-    String order = requestParser.getParameterWithDefault("order", "webdb_create desc");
-    int offset = requestParser.getIntegerWithDefault("offset", 0);
-
-    returnCommentList(aRequest, aResponse, where, order, offset);
-  }
-
-  public void search(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
-  {
-    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
-    SQLQueryBuilder queryBuilder = new SQLQueryBuilder();
-
-    String queryField = "";
-    String searchField = requestParser.getParameter("searchfield");
-    String searchText = requestParser.getParameter("searchtext");
-    String searchIsPublished = requestParser.getParameter("searchispublished");
-    String searchStatus = requestParser.getParameter("searchstatus");
-    String searchOrder = requestParser.getParameter("searchorder");
-
-    if (searchIsPublished.equals("0")) {
-      queryBuilder.appendAndCondition("is_published='f'");
-    }
-    else if (searchIsPublished.equals("1")) {
-      queryBuilder.appendAndCondition("is_published='t'");
-    }
-
-    if (searchText.length()>0) {
-        queryBuilder.appendAndCondition(
-          "lower("+ searchField + ") like " +
-          "'%" + JDBCStringRoutines.escapeStringLiteral(searchText.toLowerCase()) + "%'");
-    }
-
-    if (searchStatus.length()>0) {
-      queryBuilder.appendAndCondition("to_comment_status="+Integer.parseInt(searchStatus));
-    }
-
-    if (searchOrder.length()>0) {
-      if (searchOrder.equals("datedesc"))
-        queryBuilder.appendAscendingOrder("webdb_create");
-      else if (searchOrder.equals("dateasc"))
-        queryBuilder.appendDescendingOrder("webdb_create");
-      else if (searchOrder.equals("articletitle"))
-        queryBuilder.appendAscendingOrder("(select content.title from content where content.id = comment.to_media)");
-      else if (searchOrder.equals("creator"))
-        queryBuilder.appendDescendingOrder("creator");
-    }
-
-    returnCommentList(aRequest, aResponse, queryBuilder.getWhereClause(), queryBuilder.getOrderByClause(), 0);
-  }
-
-  public void articlecomments(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc
-  {
-    String articleIdString = req.getParameter("articleid");
-    int articleId;
-
-    try {
-      articleId  = Integer.parseInt(articleIdString);
-
-      returnCommentList( req, res, "to_media="+articleId, "webdb_create desc", 0);
-    }
-    catch (Throwable e) {
-      throw new ServletModuleFailure(e);
-    }
-  }
-
-  public void returnCommentList(HttpServletRequest aRequest, HttpServletResponse aResponse,
-     String aWhereClause, String anOrderByClause, int anOffset) throws ServletModuleExc {
-    // ML: experiment in using the producer's generation system instead of the
-    //     old one...
-
-    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
-    URLBuilder urlBuilder = new URLBuilder();
-    EntityAdapterModel model;
-    int nrCommentsPerPage = 20;
-    int count;
-
-    try {
-      Map responseData = ServletHelper.makeGenerationData(new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});
-      model = MirGlobal.localizer().dataModel().adapterModel();
-
-      Object commentList =
-          new CachingRewindableIterator(
-            new EntityIteratorAdapter( aWhereClause, anOrderByClause, nrCommentsPerPage,
-              MirGlobal.localizer().dataModel().adapterModel(), "comment", nrCommentsPerPage, anOffset)
-      );
-
-      responseData.put("nexturl", null);
-      responseData.put("prevurl", null);
-
-      count=mainModule.getSize(aWhereClause);
-
-      urlBuilder.setValue("module", "Comment");
-      urlBuilder.setValue("do", "list");
-      urlBuilder.setValue("where", aWhereClause);
-      urlBuilder.setValue("order", anOrderByClause);
-
-      urlBuilder.setValue("searchfield", requestParser.getParameter("searchfield"));
-      urlBuilder.setValue("searchtext", requestParser.getParameter("searchtext"));
-      urlBuilder.setValue("searchispublished", requestParser.getParameter("searchispublished"));
-      urlBuilder.setValue("searchstatus", requestParser.getParameter("searchstatus"));
-      urlBuilder.setValue("searchorder", requestParser.getParameter("searchorder"));
-
-      responseData.put("searchfield", requestParser.getParameter("searchfield"));
-      responseData.put("searchtext", requestParser.getParameter("searchtext"));
-      responseData.put("searchispublished", requestParser.getParameter("searchispublished"));
-      responseData.put("searchstatus", requestParser.getParameter("searchstatus"));
-      responseData.put("searchorder", requestParser.getParameter("searchorder"));
-
-      urlBuilder.setValue("offset", anOffset);
-      responseData.put("offset" , new Integer(anOffset).toString());
-      responseData.put("thisurl" , urlBuilder.getQuery());
-
-      if (count>=anOffset+nrCommentsPerPage) {
-        urlBuilder.setValue("offset", anOffset + nrCommentsPerPage);
-        responseData.put("nexturl" , urlBuilder.getQuery());
-      }
-
-      if (anOffset>0) {
-        urlBuilder.setValue("offset", Math.max(anOffset - nrCommentsPerPage, 0));
-        responseData.put("prevurl" , urlBuilder.getQuery());
-      }
-
-      responseData.put("comments", commentList);
-      responseData.put("from" , Integer.toString(anOffset+1));
-      responseData.put("count", Integer.toString(count));
-      responseData.put("to", Integer.toString(Math.min(anOffset+nrCommentsPerPage, count)));
-
-      ServletHelper.generateResponse(aResponse.getWriter(), responseData, "commentlist.template");
-    }
-    catch (Throwable e) {
-      throw new ServletModuleFailure(e);
-    }
-  }
-}
-
+/*\r
+ * Copyright (C) 2001, 2002  The Mir-coders group\r
+ *\r
+ * This file is part of Mir.\r
+ *\r
+ * Mir is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * Mir is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with Mir; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ *\r
+ * In addition, as a special exception, The Mir-coders gives permission to link\r
+ * the code of this program with the com.oreilly.servlet library, any library\r
+ * licensed under the Apache Software License, The Sun (tm) Java Advanced\r
+ * Imaging library (JAI), The Sun JIMI library (or with modified versions of\r
+ * the above that use the same license as the above), and distribute linked\r
+ * combinations including the two.  You must obey the GNU General Public\r
+ * License in all respects for all of the code used other than the above\r
+ * mentioned libraries.  If you modify this file, you may extend this exception\r
+ * to your version of the file, but you are not obligated to do so.  If you do\r
+ * not wish to do so, delete this exception statement from your version.\r
+ */\r
+\r
+package mircoders.servlet;\r
+\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Locale;\r
+import java.util.Map;\r
+import javax.servlet.http.HttpServletRequest;\r
+import javax.servlet.http.HttpServletResponse;\r
+\r
+import mir.config.MirPropertiesConfiguration;\r
+import mir.entity.adapter.EntityAdapterModel;\r
+import mir.entity.adapter.EntityIteratorAdapter;\r
+import mir.log.LoggerWrapper;\r
+import mir.servlet.ServletModule;\r
+import mir.servlet.ServletModuleExc;\r
+import mir.servlet.ServletModuleFailure;\r
+import mir.util.CachingRewindableIterator;\r
+import mir.util.HTTPRequestParser;\r
+import mir.util.JDBCStringRoutines;\r
+import mir.util.SQLQueryBuilder;\r
+import mir.util.URLBuilder;\r
+import mircoders.entity.EntityComment;\r
+import mircoders.global.MirGlobal;\r
+import mircoders.module.ModuleComment;\r
+import mircoders.module.ModuleContent;\r
+import mircoders.storage.DatabaseComment;\r
+import mircoders.storage.DatabaseContent;\r
+\r
+/*\r
+ *  ServletModuleComment - controls navigation for Comments\r
+ *\r
+ *\r
+ *  @author RK\r
+ */\r
+\r
+public class ServletModuleComment extends ServletModule\r
+{\r
+  private ModuleContent     moduleContent;\r
+\r
+  private static ServletModuleComment instance = new ServletModuleComment();\r
+  public static ServletModule getInstance() { return instance; }\r
+\r
+  private ServletModuleComment() {\r
+    logger = new LoggerWrapper("ServletModule.Comment");\r
+    try {\r
+      configuration = MirPropertiesConfiguration.instance();\r
+      templateListString = configuration.getString("ServletModule.Comment.ListTemplate");\r
+      templateObjektString = configuration.getString("ServletModule.Comment.ObjektTemplate");\r
+      templateConfirmString = configuration.getString("ServletModule.Comment.ConfirmTemplate");\r
+\r
+      mainModule = new ModuleComment(DatabaseComment.getInstance());\r
+      moduleContent = new ModuleContent(DatabaseContent.getInstance());\r
+    }\r
+    catch (Exception e) {\r
+      logger.error("servletmodule comment could not be initialized:" + e.getMessage());\r
+    }\r
+  }\r
+\r
+  public void edit(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc\r
+  {\r
+    String idParam = req.getParameter("id");\r
+\r
+    if (idParam == null)\r
+      throw new ServletModuleExc("Invalid call: id not supplied ");\r
+\r
+    showComment(idParam, req, res);\r
+  }\r
+\r
+  public void showComment(String anId, HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc {\r
+    try {\r
+      HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
+      Map responseData = ServletHelper.makeGenerationData(new Locale[] {getLocale(aRequest), getFallbackLocale(aRequest)});\r
+      EntityAdapterModel model = MirGlobal.localizer().dataModel().adapterModel();\r
+      Map comment;\r
+      URLBuilder urlBuilder = new URLBuilder();\r
+\r
+      urlBuilder.setValue("module", "Comment");\r
+      urlBuilder.setValue("do", "edit");\r
+      urlBuilder.setValue("id", anId);\r
+      urlBuilder.setValue("returnurl", requestParser.getParameter("returnurl"));\r
+\r
+      if (anId != null) {\r
+        responseData.put("new", Boolean.FALSE);\r
+        comment = model.makeEntityAdapter("comment", mainModule.getById(anId));\r
+      }\r
+      else {\r
+        List fields = DatabaseComment.getInstance().getFields();\r
+        responseData.put("new", Boolean.TRUE);\r
+        comment = new HashMap();\r
+        Iterator i = fields.iterator();\r
+        while (i.hasNext()) {\r
+          comment.put(i.next(), null);\r
+        }\r
+\r
+//        MirGlobal.localizer().adminInterface().initializeArticle(article);\r
+      }\r
+      responseData.put("comment", comment);\r
+\r
+      responseData.put("returnurl", requestParser.getParameter("returnurl"));\r
+      responseData.put("thisurl", urlBuilder.getQuery());\r
+\r
+      ServletHelper.generateResponse(aResponse.getWriter(), responseData, templateObjektString);\r
+    }\r
+    catch (Throwable e) {\r
+      throw new ServletModuleFailure(e);\r
+    }\r
+  }\r
+\r
+  public void attach(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc\r
+  {\r
+    String  mediaIdParam = req.getParameter("mid");\r
+    String  commentId = req.getParameter("commentid");\r
+\r
+    if (commentId == null || mediaIdParam==null) throw new ServletModuleExc("smod comment :: attach :: commentid/mid missing");\r
+\r
+    try {\r
+      EntityComment comment = (EntityComment) mainModule.getById(commentId);\r
+      comment.attach(mediaIdParam);\r
+    }\r
+    catch(Throwable e) {\r
+      throw new ServletModuleFailure(e);\r
+    }\r
+\r
+    showComment(commentId, req, res);\r
+  }\r
+\r
+  public void dettach(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc\r
+  {\r
+    String  commentId = req.getParameter("commentid");\r
+    String  midParam = req.getParameter("mid");\r
+    if (commentId == null)\r
+      throw new ServletModuleExc("smod comment :: dettach :: commentid missing");\r
+    if (midParam == null)\r
+      throw new ServletModuleExc("smod comment :: dettach :: mid missing");\r
+\r
+    try {\r
+      EntityComment comment = (EntityComment)mainModule.getById(commentId);\r
+      comment.dettach(commentId, midParam);\r
+    }\r
+    catch(Throwable e) {\r
+      throw new ServletModuleFailure(e);\r
+    }\r
+\r
+    showComment(commentId, req, res);\r
+  }\r
+\r
+\r
+  public void list(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
+  {\r
+    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
+\r
+    String where = requestParser.getParameter("where");\r
+    String order = requestParser.getParameterWithDefault("order", "webdb_create desc");\r
+    int offset = requestParser.getIntegerWithDefault("offset", 0);\r
+\r
+    returnCommentList(aRequest, aResponse, where, order, offset);\r
+  }\r
+\r
+  public void search(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc\r
+  {\r
+    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
+    SQLQueryBuilder queryBuilder = new SQLQueryBuilder();\r
+\r
+    String queryField = "";\r
+    String searchField = requestParser.getParameter("searchfield");\r
+    String searchText = requestParser.getParameter("searchtext");\r
+    String searchIsPublished = requestParser.getParameter("searchispublished");\r
+    String searchStatus = requestParser.getParameter("searchstatus");\r
+    String searchOrder = requestParser.getParameter("searchorder");\r
+\r
+    if (searchIsPublished.equals("0")) {\r
+      queryBuilder.appendAndCondition("is_published='f'");\r
+    }\r
+    else if (searchIsPublished.equals("1")) {\r
+      queryBuilder.appendAndCondition("is_published='t'");\r
+    }\r
+\r
+    if (searchText.length()>0) {\r
+        queryBuilder.appendAndCondition(\r
+          "lower("+ searchField + ") like " +\r
+          "'%" + JDBCStringRoutines.escapeStringLiteral(searchText.toLowerCase()) + "%'");\r
+    }\r
+\r
+    if (searchStatus.length()>0) {\r
+      queryBuilder.appendAndCondition("to_comment_status="+Integer.parseInt(searchStatus));\r
+    }\r
+\r
+    if (searchOrder.length()>0) {\r
+      if (searchOrder.equals("datedesc"))\r
+        queryBuilder.appendAscendingOrder("webdb_create");\r
+      else if (searchOrder.equals("dateasc"))\r
+        queryBuilder.appendDescendingOrder("webdb_create");\r
+      else if (searchOrder.equals("articletitle"))\r
+        queryBuilder.appendAscendingOrder("(select content.title from content where content.id = comment.to_media)");\r
+      else if (searchOrder.equals("creator"))\r
+        queryBuilder.appendDescendingOrder("creator");\r
+    }\r
+\r
+    returnCommentList(aRequest, aResponse, queryBuilder.getWhereClause(), queryBuilder.getOrderByClause(), 0);\r
+  }\r
+\r
+  public void articlecomments(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc\r
+  {\r
+    String articleIdString = req.getParameter("articleid");\r
+    int articleId;\r
+\r
+    try {\r
+      articleId  = Integer.parseInt(articleIdString);\r
+\r
+      returnCommentList( req, res, "to_media="+articleId, "webdb_create desc", 0);\r
+    }\r
+    catch (Throwable e) {\r
+      throw new ServletModuleFailure(e);\r
+    }\r
+  }\r
+\r
+  public void returnCommentList(HttpServletRequest aRequest, HttpServletResponse aResponse,\r
+     String aWhereClause, String anOrderByClause, int anOffset) throws ServletModuleExc {\r
+\r
+    HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);\r
+    URLBuilder urlBuilder = new URLBuilder();\r
+    EntityAdapterModel model;\r
+    int nrCommentsPerPage = 20;\r
+    int count;\r
+\r
+    try {\r
+      Map responseData = ServletHelper.makeGenerationData(new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});\r
+      model = MirGlobal.localizer().dataModel().adapterModel();\r
+\r
+      Object commentList =\r
+          new CachingRewindableIterator(\r
+            new EntityIteratorAdapter( aWhereClause, anOrderByClause, nrCommentsPerPage,\r
+              MirGlobal.localizer().dataModel().adapterModel(), "comment", nrCommentsPerPage, anOffset)\r
+      );\r
+\r
+      responseData.put("nexturl", null);\r
+      responseData.put("prevurl", null);\r
+\r
+      count=mainModule.getSize(aWhereClause);\r
+\r
+      urlBuilder.setValue("module", "Comment");\r
+      urlBuilder.setValue("do", "list");\r
+      urlBuilder.setValue("where", aWhereClause);\r
+      urlBuilder.setValue("order", anOrderByClause);\r
+\r
+      urlBuilder.setValue("searchfield", requestParser.getParameter("searchfield"));\r
+      urlBuilder.setValue("searchtext", requestParser.getParameter("searchtext"));\r
+      urlBuilder.setValue("searchispublished", requestParser.getParameter("searchispublished"));\r
+      urlBuilder.setValue("searchstatus", requestParser.getParameter("searchstatus"));\r
+      urlBuilder.setValue("searchorder", requestParser.getParameter("searchorder"));\r
+\r
+      responseData.put("searchfield", requestParser.getParameter("searchfield"));\r
+      responseData.put("searchtext", requestParser.getParameter("searchtext"));\r
+      responseData.put("searchispublished", requestParser.getParameter("searchispublished"));\r
+      responseData.put("searchstatus", requestParser.getParameter("searchstatus"));\r
+      responseData.put("searchorder", requestParser.getParameter("searchorder"));\r
+\r
+      urlBuilder.setValue("offset", anOffset);\r
+      responseData.put("offset" , new Integer(anOffset).toString());\r
+      responseData.put("thisurl" , urlBuilder.getQuery());\r
+\r
+      if (count>=anOffset+nrCommentsPerPage) {\r
+        urlBuilder.setValue("offset", anOffset + nrCommentsPerPage);\r
+        responseData.put("nexturl" , urlBuilder.getQuery());\r
+      }\r
+\r
+      if (anOffset>0) {\r
+        urlBuilder.setValue("offset", Math.max(anOffset - nrCommentsPerPage, 0));\r
+        responseData.put("prevurl" , urlBuilder.getQuery());\r
+      }\r
+\r
+      responseData.put("comments", commentList);\r
+      responseData.put("from" , Integer.toString(anOffset+1));\r
+      responseData.put("count", Integer.toString(count));\r
+      responseData.put("to", Integer.toString(Math.min(anOffset+nrCommentsPerPage, count)));\r
+\r
+      ServletHelper.generateResponse(aResponse.getWriter(), responseData, "commentlist.template");\r
+    }\r
+    catch (Throwable e) {\r
+      throw new ServletModuleFailure(e);\r
+    }\r
+  }\r
+}\r
+\r
index 3c16851..78b9ff0 100755 (executable)
 
 package mircoders.servlet;
 
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Locale;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
-import org.apache.lucene.index.IndexReader;
-import freemarker.template.SimpleHash;
-import mir.entity.adapter.EntityAdapterModel;
-import mir.entity.adapter.EntityIteratorAdapter;
-import mir.log.LoggerWrapper;
-import mir.misc.StringUtil;
-import mir.servlet.ServletModule;
-import mir.servlet.ServletModuleExc;
-import mir.servlet.ServletModuleFailure;
-import mir.util.CachingRewindableIterator;
-import mir.util.HTTPRequestParser;
-import mir.util.JDBCStringRoutines;
-import mir.util.SQLQueryBuilder;
-import mir.util.URLBuilder;
-
-import mircoders.entity.EntityContent;
-import mircoders.entity.EntityUsers;
-import mircoders.global.MirGlobal;
-import mircoders.module.ModuleContent;
-import mircoders.search.IndexUtil;
-import mircoders.storage.DatabaseComment;
-import mircoders.storage.DatabaseContent;
+import java.util.GregorianCalendar;\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Locale;\r
+import java.util.Map;\r
+import javax.servlet.http.HttpServletRequest;\r
+import javax.servlet.http.HttpServletResponse;\r
+import javax.servlet.http.HttpSession;\r
+\r
+import org.apache.lucene.index.IndexReader;\r
+import freemarker.template.SimpleHash;\r
+import mir.entity.adapter.EntityAdapterModel;\r
+import mir.entity.adapter.EntityIteratorAdapter;\r
+import mir.log.LoggerWrapper;\r
+import mir.misc.StringUtil;\r
+import mir.servlet.ServletModule;\r
+import mir.servlet.ServletModuleExc;\r
+import mir.servlet.ServletModuleFailure;\r
+import mir.util.CachingRewindableIterator;\r
+import mir.util.HTTPRequestParser;\r
+import mir.util.JDBCStringRoutines;\r
+import mir.util.SQLQueryBuilder;\r
+import mir.util.URLBuilder;\r
+import mircoders.entity.EntityContent;\r
+import mircoders.entity.EntityUsers;\r
+import mircoders.global.MirGlobal;\r
+import mircoders.module.ModuleContent;\r
+import mircoders.search.IndexUtil;\r
+import mircoders.storage.DatabaseComment;\r
+import mircoders.storage.DatabaseContent;\r
+import mircoders.storage.DatabaseContentToMedia;\r
 import mircoders.storage.DatabaseContentToTopics;
-import mircoders.storage.DatabaseContentToMedia;
 
 /*
  *  ServletModuleContent -
  *  deliver html for the article admin form.
  *
- * @version $Id: ServletModuleContent.java,v 1.47 2003/04/09 02:06:09 zapata Exp $
+ * @version $Id: ServletModuleContent.java,v 1.48 2003/04/10 03:31:47 zapata Exp $
  * @author rk, mir-coders
  *
  */
@@ -263,38 +262,40 @@ public class ServletModuleContent extends ServletModule
   public void attach(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc
   {
     String  mediaIdParam = req.getParameter("mid");
-    String  idParam = req.getParameter("cid");
-    if (idParam == null||mediaIdParam==null) throw new ServletModuleExc("smod content :: attach :: cid/mid missing");
+    String  articleId = req.getParameter("articleid");
+
+    if (articleId == null || mediaIdParam==null)
+      throw new ServletModuleExc("smod content :: attach :: articleid/mid missing");
 
     try {
-      EntityContent entContent = (EntityContent)mainModule.getById(idParam);
+      EntityContent entContent = (EntityContent) mainModule.getById(articleId);
       entContent.attach(mediaIdParam);
     }
     catch(Throwable e) {
-      logger.error("smod content :: attach :: could not get entityContent");
+      throw new ServletModuleFailure(e);
     }
 
-    _showObject(idParam, req, res);
+    _showObject(articleId, req, res);
   }
 
   public void dettach(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc
   {
-    String  cidParam = req.getParameter("cid");
+    String  articleId = req.getParameter("articleid");
     String  midParam = req.getParameter("mid");
-    if (cidParam == null)
-      throw new ServletModuleExc("smod content :: dettach :: cid missing");
+    if (articleId == null)
+      throw new ServletModuleExc("smod content :: dettach :: articleid missing");
     if (midParam == null)
       throw new ServletModuleExc("smod content :: dettach :: mid missing");
 
     try {
-      EntityContent entContent = (EntityContent)mainModule.getById(cidParam);
-      entContent.dettach(cidParam,midParam);
+      EntityContent entContent = (EntityContent)mainModule.getById(articleId);
+      entContent.dettach(articleId, midParam);
     }
     catch(Throwable e) {
-      logger.error("smod content :: dettach :: could not get entityContent");
+      throw new ServletModuleFailure(e);
     }
 
-    _showObject(cidParam, req, res);
+    _showObject(articleId, req, res);
   }
 
   public void update(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
index d2e4811..db23bc0 100755 (executable)
@@ -118,7 +118,7 @@ import mircoders.storage.DatabaseTopics;
  *    open-postings to the newswire
  *
  * @author mir-coders group
- * @version $Id: ServletModuleOpenIndy.java,v 1.71 2003/04/09 02:06:09 zapata Exp $
+ * @version $Id: ServletModuleOpenIndy.java,v 1.72 2003/04/10 03:31:47 zapata Exp $
  *
  */
 
@@ -1085,9 +1085,4 @@ public class ServletModuleOpenIndy extends ServletModule
       throw new ServletModuleFailure(e);
     }
   }
-
-
 }
-
-
-
index 88dfa68..d790412 100755 (executable)
-/*
- * Copyright (C) 2001, 2002  The Mir-coders group
- *
- * This file is part of Mir.
- *
- * Mir is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * Mir is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Mir; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * In addition, as a special exception, The Mir-coders gives permission to link
- * the code of this program with the com.oreilly.servlet library, any library
- * licensed under the Apache Software License, The Sun (tm) Java Advanced
- * Imaging library (JAI), The Sun JIMI library (or with modified versions of
- * the above that use the same license as the above), and distribute linked
- * combinations including the two.  You must obey the GNU General Public
- * License in all respects for all of the code used other than the above
- * mentioned libraries.  If you modify this file, you may extend this exception
- * to your version of the file, but you are not obligated to do so.  If you do
- * not wish to do so, delete this exception statement from your version.
- */
-
-package mircoders.servlet;
-
-import java.io.InputStream;
-import java.net.URLEncoder;
-import java.util.Map;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
-import mir.config.MirPropertiesConfiguration;
-import mir.entity.Entity;
-import mir.entity.EntityList;
-import mir.log.LoggerWrapper;
-import mir.media.MediaHelper;
-import mir.media.MirMedia;
-import mir.misc.FileHandler;
-import mir.misc.WebdbMultipartRequest;
-import mir.servlet.ServletModule;
-import mir.servlet.ServletModuleExc;
-import mir.servlet.ServletModuleFailure;
-import mir.servlet.ServletModuleUserExc;
-import mir.util.ExceptionFunctions;
-import mircoders.entity.EntityContent;
-import mircoders.entity.EntityUploadedMedia;
-import mircoders.entity.EntityUsers;
-import mircoders.media.MediaRequest;
-import mircoders.media.UnsupportedMediaFormatExc;
-import mircoders.storage.DatabaseContent;
-import mircoders.storage.DatabaseMediafolder;
-import freemarker.template.SimpleHash;
-import freemarker.template.SimpleList;
-
-/*
- *  ServletModuleBilder -
- *  liefert HTML fuer Bilder
- *
- * @version $Id: ServletModuleUploadedMedia.java,v 1.23 2003/03/09 19:14:21 idfx Exp $
- * @author RK, the mir-coders group
- */
-
-public abstract class ServletModuleUploadedMedia
-        extends mir.servlet.ServletModule {
-
-  //private static DatabaseRights dbRights;
-
-  public static ServletModule getInstance() {
-    return null;
-  }
-
-  public ServletModuleUploadedMedia() {
-    super();
-    logger = new LoggerWrapper("ServletModule.UploadedMedia");
-  }
-
-  public void insert(HttpServletRequest req, HttpServletResponse res)
-          throws ServletModuleExc, ServletModuleUserExc {
-    try {
-      EntityUsers user = _getUser(req);
-      MediaRequest mediaReq =  new MediaRequest(user.getId(), false);
-      WebdbMultipartRequest mp = new WebdbMultipartRequest(req, (FileHandler)mediaReq);
-      EntityList mediaList = mediaReq.getEntityList();
-      String articleid = (String) mp.getParameters().get("articleid");
-
-      if (articleid!=null) {
-        EntityContent entContent = (EntityContent) DatabaseContent.getInstance().selectById(articleid);
-
-        mediaList.rewind();
-
-        while (mediaList.hasNext()) {
-          entContent.attach( ( (EntityUploadedMedia) mediaList.next()).getId());
-        }
-        mediaList.rewind();
-
-        ((ServletModuleContent) ServletModuleContent.getInstance())._showObject(articleid, req, res);
-
-        return;
-      }
-
-      SimpleHash mergeData = new SimpleHash();
-      SimpleHash popups = new SimpleHash();
-      mergeData.put("contentlist", mediaList);
-      if (mediaList.getOrder() != null) {
-        mergeData.put("order", mediaList.getOrder());
-        mergeData.put("order_encoded", URLEncoder.encode(mediaList.getOrder()));
-      }
-      mergeData.put("count", (new Integer(mediaList.getCount())).toString());
-      mergeData.put("from", (new Integer(mediaList.getFrom())).toString());
-      mergeData.put("to", (new Integer(mediaList.getTo())).toString());
-      if (mediaList.hasNextBatch())
-        mergeData.put("next", (new Integer(mediaList.getNextBatch())).toString());
-      if (mediaList.hasPrevBatch())
-        mergeData.put("prev", (new Integer(mediaList.getPrevBatch())).toString());
-      //fetch the popups
-      popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData());
-      // raus damit
-      deliver(req, res, mergeData, popups, templateListString);
-    }
-    catch (Throwable t) {
-      Throwable cause = ExceptionFunctions.traceCauseException(t);
-
-      if (cause instanceof UnsupportedMediaFormatExc) {
-        throw new ServletModuleUserExc("media.error.unsupportedformat", new String[] {});
-      }
-      throw new ServletModuleFailure("ServletModuleUploadedMedia.insert: " + t.toString(), t);
-    }
-  }
-
-  public void update(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {
-
-    try {
-      EntityUsers user = _getUser(req);
-      WebdbMultipartRequest mp = new WebdbMultipartRequest(req, null);
-      Map parameters = mp.getParameters();
-
-      parameters.put("to_publisher", user.getId());
-      parameters.put("is_produced", "0");
-      if (!parameters.containsKey("is_published"))
-        parameters.put("is_published", "0");
-
-      String id = mainModule.set(parameters);
-      logger.debug("update: media ID = " + id);
-      _edit(id, req, res);
-    }
-    catch (Throwable e) {
-      throw new ServletModuleFailure("upload -- exception " + e.toString(), e);
-    }
-
-  }
-
-
-  public void list(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {
-    // Parameter auswerten
-    SimpleHash mergeData = new SimpleHash();
-    SimpleHash popups = new SimpleHash();
-
-    String query_text = req.getParameter("query_text");
-    mergeData.put("query_text", query_text);
-    if (query_text != null) mergeData.put("query_text_encoded", URLEncoder.encode(query_text));
-    String query_field = req.getParameter("query_field");
-    mergeData.put("query_field", query_field);
-    String query_is_published = req.getParameter("query_is_published");
-    mergeData.put("query_is_published", query_is_published);
-    String query_media_folder = req.getParameter("query_media_folder");
-    mergeData.put("query_media_folder", query_media_folder);
-    String offset = req.getParameter("offset");
-    if (offset == null || offset.equals("")) offset = "0";
-    mergeData.put("offset", offset);
-
-    String order = req.getParameter("order");
-    if (order == null || order.equals("")) order = "webdb_lastchange desc";
-
-    // if in connection mode to content
-    String cid = req.getParameter("cid");
-    mergeData.put("cid", cid);
-
-
-    // sql basteln
-    String whereClause = "";
-    boolean isFirst = true;
-    if (query_text != null && !query_text.equalsIgnoreCase("")) {
-      whereClause += "lower(" + query_field + ") like lower('%" + query_text + "%')";
-      isFirst = false;
-    }
-    if (query_is_published != null && !query_is_published.equals("")) {
-      if (isFirst == false) whereClause += " and ";
-      whereClause += "is_published='" + query_is_published + "'";
-      isFirst = false;
-    }
-    if (query_media_folder != null && !query_media_folder.equals("")) {
-      if (isFirst == false) whereClause += " and ";
-      whereClause += "to_media_folder='" + query_media_folder + "'";
-    }
-    //theLog.printDebugInfo("sql-whereclause: " + whereClause + " order: " + order + " offset: " + offset);
-
-    // fetch and deliver
-    try {
-      if (query_text != null || query_is_published != null || query_media_folder != null) {
-        EntityList theList = mainModule.getByWhereClause(whereClause, order, (new Integer(offset)).intValue(), 10);
-        if (theList != null) {
-          mergeData.put("contentlist", theList);
-          if (theList.getOrder() != null) {
-            mergeData.put("order", theList.getOrder());
-            mergeData.put("order_encoded", URLEncoder.encode(theList.getOrder()));
-          }
-          mergeData.put("count", (new Integer(theList.getCount())).toString());
-          mergeData.put("from", (new Integer(theList.getFrom())).toString());
-          mergeData.put("to", (new Integer(theList.getTo())).toString());
-          if (theList.hasNextBatch())
-            mergeData.put("next", (new Integer(theList.getNextBatch())).toString());
-          if (theList.hasPrevBatch())
-            mergeData.put("prev", (new Integer(theList.getPrevBatch())).toString());
-        }
-      }
-      popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData());
-
-      deliver(req, res, mergeData, popups, templateListString);
-    }
-    catch (Throwable e) {
-      throw new ServletModuleFailure(e);
-    }
-  }
-
-
-  public void add(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {
-    try {
-      SimpleHash mergeData = new SimpleHash();
-      SimpleHash popups = new SimpleHash();
-      String maxMedia = MirPropertiesConfiguration.instance().getString("ServletModule.OpenIndy.MaxMediaUploadItems");
-      String numOfMedia = req.getParameter("medianum");
-
-      mergeData.put("new", "1");
-      mergeData.put("articleid", req.getParameter("articleid"));
-
-      popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData());
-
-      if (numOfMedia==null || numOfMedia.equals("")) {
-        numOfMedia="1";
-      }
-      else if(Integer.parseInt(numOfMedia) > Integer.parseInt(maxMedia)) {
-        numOfMedia = maxMedia;
-      }
-
-      int mediaNum = Integer.parseInt(numOfMedia);
-      SimpleList mediaFields = new SimpleList();
-      for(int i =0; i<mediaNum;i++){
-        Integer mNum = new Integer(i+1);
-        mediaFields.add(mNum.toString());
-      }
-      mergeData.put("medianum",numOfMedia);
-      mergeData.put("mediafields",mediaFields);
-      deliver(req, res, mergeData, popups, templateObjektString);
-    }
-    catch (Exception e) {
-      throw new ServletModuleFailure(e);
-    }
-  }
-
-  public void edit(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {
-    String idParam = req.getParameter("id");
-    _edit(idParam, req, res);
-  }
-
-  private void _edit(String idParam, HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {
-    if (idParam != null && !idParam.equals("")) {
-      try {
-        SimpleHash popups = new SimpleHash();
-        popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData());
-        deliver(req, res, mainModule.getById(idParam), popups,
-                templateObjektString);
-      }
-      catch (Throwable e) {
-        throw new ServletModuleFailure(e);
-      }
-    }
-    else {
-      throw new ServletModuleExc("ServletmoduleUploadedMedia :: _edit without id");
-    }
-  }
-
-
-  /** @todo should be in ServletModule.java */
-  private EntityUsers _getUser(HttpServletRequest req) {
-    HttpSession session = req.getSession(false);
-    return (EntityUsers) session.getAttribute("login.uid");
-  }
-
-  public void getMedia(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {
-    String idParam = req.getParameter("id");
-    if (idParam!=null && !idParam.equals("")) {
-      try {
-        EntityUploadedMedia ent = (EntityUploadedMedia)mainModule.getById(idParam);
-        Entity mediaType = ent.getMediaType();
-        MirMedia mediaHandler;
-
-        ServletContext ctx = MirPropertiesConfiguration.getContext();
-        String fName = ent.getId()+"."+mediaType.getValue("name");
-
-        mediaHandler = MediaHelper.getHandler(mediaType);
-        InputStream in = mediaHandler.getMedia(ent, mediaType);
-
-        res.setContentType(ctx.getMimeType(fName));
-        //important that before calling this res.getWriter was not called first
-        ServletOutputStream out = res.getOutputStream();
-
-        int read ;
-        byte[] buf = new byte[8 * 1024];
-        while((read = in.read(buf)) != -1) {
-          out.write(buf, 0, read);
-        }
-        in.close();
-        out.close();
-      }
-      catch (Throwable e) {
-        throw new ServletModuleFailure(e);
-      }
-    }
-    else logger.error("id not specified.");
-    // no exception allowed
-  }
-
-  public void getIcon(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc
-  {
-    String idParam = req.getParameter("id");
-    if (idParam!=null && !idParam.equals("")) {
-      try {
-        EntityUploadedMedia ent = (EntityUploadedMedia)mainModule.getById(idParam);
-        Entity mediaType = ent.getMediaType();
-        MirMedia mediaHandler;
-
-        ServletContext ctx = MirPropertiesConfiguration.getContext();
-        String fName = ent.getId()+"."+mediaType.getValue("name");
-
-        mediaHandler = MediaHelper.getHandler(mediaType);
-        InputStream in = mediaHandler.getIcon(ent);
-
-        res.setContentType(ctx.getMimeType(fName));
-        //important that before calling this res.getWriter was not called first
-        ServletOutputStream out = res.getOutputStream();
-
-        int read ;
-        byte[] buf = new byte[8 * 1024];
-        while((read = in.read(buf)) != -1) {
-          out.write(buf, 0, read);
-        }
-        in.close();
-        out.close();
-      }
-
-      catch (Throwable e) {
-        throw new ServletModuleFailure(e);
-      }
-    }
-    else logger.error("getIcon: id not specified.");
-    // no exception allowed
-  }
-
-}
-
-
+/*\r
+ * Copyright (C) 2001, 2002  The Mir-coders group\r
+ *\r
+ * This file is part of Mir.\r
+ *\r
+ * Mir is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * Mir is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with Mir; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ *\r
+ * In addition, as a special exception, The Mir-coders gives permission to link\r
+ * the code of this program with the com.oreilly.servlet library, any library\r
+ * licensed under the Apache Software License, The Sun (tm) Java Advanced\r
+ * Imaging library (JAI), The Sun JIMI library (or with modified versions of\r
+ * the above that use the same license as the above), and distribute linked\r
+ * combinations including the two.  You must obey the GNU General Public\r
+ * License in all respects for all of the code used other than the above\r
+ * mentioned libraries.  If you modify this file, you may extend this exception\r
+ * to your version of the file, but you are not obligated to do so.  If you do\r
+ * not wish to do so, delete this exception statement from your version.\r
+ */\r
+\r
+package mircoders.servlet;\r
+\r
+import java.io.InputStream;\r
+import java.net.URLEncoder;\r
+import java.util.Map;\r
+import javax.servlet.ServletContext;\r
+import javax.servlet.ServletOutputStream;\r
+import javax.servlet.http.HttpServletRequest;\r
+import javax.servlet.http.HttpServletResponse;\r
+import javax.servlet.http.HttpSession;\r
+\r
+import freemarker.template.SimpleHash;\r
+import freemarker.template.SimpleList;\r
+import mir.config.MirPropertiesConfiguration;\r
+import mir.entity.Entity;\r
+import mir.entity.EntityList;\r
+import mir.log.LoggerWrapper;\r
+import mir.media.MediaHelper;\r
+import mir.media.MirMedia;\r
+import mir.misc.FileHandler;\r
+import mir.misc.WebdbMultipartRequest;\r
+import mir.servlet.ServletModule;\r
+import mir.servlet.ServletModuleExc;\r
+import mir.servlet.ServletModuleFailure;\r
+import mir.servlet.ServletModuleUserExc;\r
+import mir.util.ExceptionFunctions;\r
+import mircoders.entity.EntityComment;\r
+import mircoders.entity.EntityContent;\r
+import mircoders.entity.EntityUploadedMedia;\r
+import mircoders.entity.EntityUsers;\r
+import mircoders.media.MediaRequest;\r
+import mircoders.media.UnsupportedMediaFormatExc;\r
+import mircoders.storage.DatabaseComment;\r
+import mircoders.storage.DatabaseContent;\r
+import mircoders.storage.DatabaseMediafolder;\r
+\r
+/*\r
+ *  ServletModuleBilder -\r
+ *  liefert HTML fuer Bilder\r
+ *\r
+ * @version $Id: ServletModuleUploadedMedia.java,v 1.24 2003/04/10 03:31:47 zapata Exp $\r
+ * @author RK, the mir-coders group\r
+ */\r
+\r
+public abstract class ServletModuleUploadedMedia\r
+        extends mir.servlet.ServletModule {\r
+\r
+  //private static DatabaseRights dbRights;\r
+\r
+  public static ServletModule getInstance() {\r
+    return null;\r
+  }\r
+\r
+  public ServletModuleUploadedMedia() {\r
+    super();\r
+    logger = new LoggerWrapper("ServletModule.UploadedMedia");\r
+  }\r
+\r
+  public void insert(HttpServletRequest req, HttpServletResponse res)\r
+          throws ServletModuleExc, ServletModuleUserExc {\r
+    try {\r
+      EntityUsers user = _getUser(req);\r
+      MediaRequest mediaReq =  new MediaRequest(user.getId(), false);\r
+      WebdbMultipartRequest mp = new WebdbMultipartRequest(req, (FileHandler)mediaReq);\r
+      EntityList mediaList = mediaReq.getEntityList();\r
+      String articleid = (String) mp.getParameters().get("articleid");\r
+      String commentid = (String) mp.getParameters().get("commentid");\r
+\r
+      if (articleid!=null) {\r
+        EntityContent entContent = (EntityContent) DatabaseContent.getInstance().selectById(articleid);\r
+\r
+        mediaList.rewind();\r
+\r
+        while (mediaList.hasNext()) {\r
+          entContent.attach( ( (EntityUploadedMedia) mediaList.next()).getId());\r
+        }\r
+        mediaList.rewind();\r
+\r
+        ((ServletModuleContent) ServletModuleContent.getInstance())._showObject(articleid, req, res);\r
+\r
+        return;\r
+      }\r
+\r
+      if (commentid!=null) {\r
+        EntityComment comment = (EntityComment) DatabaseComment.getInstance().selectById(commentid);\r
+\r
+        mediaList.rewind();\r
+\r
+        while (mediaList.hasNext()) {\r
+          comment.attach( ( (EntityUploadedMedia) mediaList.next()).getId());\r
+        }\r
+        mediaList.rewind();\r
+\r
+        ((ServletModuleComment) ServletModuleComment.getInstance()).showComment(commentid, req, res);\r
+\r
+        return;\r
+      }\r
+\r
+      SimpleHash mergeData = new SimpleHash();\r
+      SimpleHash popups = new SimpleHash();\r
+      mergeData.put("contentlist", mediaList);\r
+      if (mediaList.getOrder() != null) {\r
+        mergeData.put("order", mediaList.getOrder());\r
+        mergeData.put("order_encoded", URLEncoder.encode(mediaList.getOrder()));\r
+      }\r
+      mergeData.put("count", (new Integer(mediaList.getCount())).toString());\r
+      mergeData.put("from", (new Integer(mediaList.getFrom())).toString());\r
+      mergeData.put("to", (new Integer(mediaList.getTo())).toString());\r
+      if (mediaList.hasNextBatch())\r
+        mergeData.put("next", (new Integer(mediaList.getNextBatch())).toString());\r
+      if (mediaList.hasPrevBatch())\r
+        mergeData.put("prev", (new Integer(mediaList.getPrevBatch())).toString());\r
+      //fetch the popups\r
+      popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData());\r
+      // raus damit\r
+      deliver(req, res, mergeData, popups, templateListString);\r
+    }\r
+    catch (Throwable t) {\r
+      Throwable cause = ExceptionFunctions.traceCauseException(t);\r
+\r
+      if (cause instanceof UnsupportedMediaFormatExc) {\r
+        throw new ServletModuleUserExc("media.error.unsupportedformat", new String[] {});\r
+      }\r
+      throw new ServletModuleFailure("ServletModuleUploadedMedia.insert: " + t.toString(), t);\r
+    }\r
+  }\r
+\r
+  public void update(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {\r
+\r
+    try {\r
+      EntityUsers user = _getUser(req);\r
+      WebdbMultipartRequest mp = new WebdbMultipartRequest(req, null);\r
+      Map parameters = mp.getParameters();\r
+\r
+      parameters.put("to_publisher", user.getId());\r
+      parameters.put("is_produced", "0");\r
+      if (!parameters.containsKey("is_published"))\r
+        parameters.put("is_published", "0");\r
+\r
+      String id = mainModule.set(parameters);\r
+      logger.debug("update: media ID = " + id);\r
+      _edit(id, req, res);\r
+    }\r
+    catch (Throwable e) {\r
+      throw new ServletModuleFailure("upload -- exception " + e.toString(), e);\r
+    }\r
+\r
+  }\r
+\r
+\r
+  public void list(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {\r
+    // Parameter auswerten\r
+    SimpleHash mergeData = new SimpleHash();\r
+    SimpleHash popups = new SimpleHash();\r
+\r
+    String query_text = req.getParameter("query_text");\r
+    mergeData.put("query_text", query_text);\r
+    if (query_text != null) mergeData.put("query_text_encoded", URLEncoder.encode(query_text));\r
+    String query_field = req.getParameter("query_field");\r
+    mergeData.put("query_field", query_field);\r
+    String query_is_published = req.getParameter("query_is_published");\r
+    mergeData.put("query_is_published", query_is_published);\r
+    String query_media_folder = req.getParameter("query_media_folder");\r
+    mergeData.put("query_media_folder", query_media_folder);\r
+    String offset = req.getParameter("offset");\r
+    if (offset == null || offset.equals("")) offset = "0";\r
+    mergeData.put("offset", offset);\r
+\r
+    String order = req.getParameter("order");\r
+    if (order == null || order.equals("")) order = "webdb_lastchange desc";\r
+\r
+    // if in connection mode to content\r
+    mergeData.put("articleid", req.getParameter("articleid"));\r
+    mergeData.put("commentid", req.getParameter("commentid"));\r
+\r
+\r
+    // sql basteln\r
+    String whereClause = "";\r
+    boolean isFirst = true;\r
+    if (query_text != null && !query_text.equalsIgnoreCase("")) {\r
+      whereClause += "lower(" + query_field + ") like lower('%" + query_text + "%')";\r
+      isFirst = false;\r
+    }\r
+    if (query_is_published != null && !query_is_published.equals("")) {\r
+      if (isFirst == false) whereClause += " and ";\r
+      whereClause += "is_published='" + query_is_published + "'";\r
+      isFirst = false;\r
+    }\r
+    if (query_media_folder != null && !query_media_folder.equals("")) {\r
+      if (isFirst == false) whereClause += " and ";\r
+      whereClause += "to_media_folder='" + query_media_folder + "'";\r
+    }\r
+    //theLog.printDebugInfo("sql-whereclause: " + whereClause + " order: " + order + " offset: " + offset);\r
+\r
+    // fetch and deliver\r
+    try {\r
+      if (query_text != null || query_is_published != null || query_media_folder != null) {\r
+        EntityList theList = mainModule.getByWhereClause(whereClause, order, (new Integer(offset)).intValue(), 10);\r
+        if (theList != null) {\r
+          mergeData.put("contentlist", theList);\r
+          if (theList.getOrder() != null) {\r
+            mergeData.put("order", theList.getOrder());\r
+            mergeData.put("order_encoded", URLEncoder.encode(theList.getOrder()));\r
+          }\r
+          mergeData.put("count", (new Integer(theList.getCount())).toString());\r
+          mergeData.put("from", (new Integer(theList.getFrom())).toString());\r
+          mergeData.put("to", (new Integer(theList.getTo())).toString());\r
+          if (theList.hasNextBatch())\r
+            mergeData.put("next", (new Integer(theList.getNextBatch())).toString());\r
+          if (theList.hasPrevBatch())\r
+            mergeData.put("prev", (new Integer(theList.getPrevBatch())).toString());\r
+        }\r
+      }\r
+      popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData());\r
+\r
+      deliver(req, res, mergeData, popups, templateListString);\r
+    }\r
+    catch (Throwable e) {\r
+      throw new ServletModuleFailure(e);\r
+    }\r
+  }\r
+\r
+\r
+  public void add(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {\r
+    try {\r
+      SimpleHash mergeData = new SimpleHash();\r
+      SimpleHash popups = new SimpleHash();\r
+      String maxMedia = MirPropertiesConfiguration.instance().getString("ServletModule.OpenIndy.MaxMediaUploadItems");\r
+      String numOfMedia = req.getParameter("medianum");\r
+\r
+      mergeData.put("new", "1");\r
+      mergeData.put("articleid", req.getParameter("articleid"));\r
+      mergeData.put("commentid", req.getParameter("commentid"));\r
+\r
+      popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData());\r
+\r
+      if (numOfMedia==null || numOfMedia.equals("")) {\r
+        numOfMedia="1";\r
+      }\r
+      else if(Integer.parseInt(numOfMedia) > Integer.parseInt(maxMedia)) {\r
+        numOfMedia = maxMedia;\r
+      }\r
+\r
+      int mediaNum = Integer.parseInt(numOfMedia);\r
+      SimpleList mediaFields = new SimpleList();\r
+      for(int i =0; i<mediaNum;i++){\r
+        Integer mNum = new Integer(i+1);\r
+        mediaFields.add(mNum.toString());\r
+      }\r
+      mergeData.put("medianum",numOfMedia);\r
+      mergeData.put("mediafields",mediaFields);\r
+      deliver(req, res, mergeData, popups, templateObjektString);\r
+    }\r
+    catch (Exception e) {\r
+      throw new ServletModuleFailure(e);\r
+    }\r
+  }\r
+\r
+  public void edit(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {\r
+    String idParam = req.getParameter("id");\r
+    _edit(idParam, req, res);\r
+  }\r
+\r
+  private void _edit(String idParam, HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {\r
+    if (idParam != null && !idParam.equals("")) {\r
+      try {\r
+        SimpleHash popups = new SimpleHash();\r
+        popups.put("mediafolderPopupData", DatabaseMediafolder.getInstance().getPopupData());\r
+        deliver(req, res, mainModule.getById(idParam), popups,\r
+                templateObjektString);\r
+      }\r
+      catch (Throwable e) {\r
+        throw new ServletModuleFailure(e);\r
+      }\r
+    }\r
+    else {\r
+      throw new ServletModuleExc("ServletmoduleUploadedMedia :: _edit without id");\r
+    }\r
+  }\r
+\r
+\r
+  /** @todo should be in ServletModule.java */\r
+  private EntityUsers _getUser(HttpServletRequest req) {\r
+    HttpSession session = req.getSession(false);\r
+    return (EntityUsers) session.getAttribute("login.uid");\r
+  }\r
+\r
+  public void getMedia(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc {\r
+    String idParam = req.getParameter("id");\r
+    if (idParam!=null && !idParam.equals("")) {\r
+      try {\r
+        EntityUploadedMedia ent = (EntityUploadedMedia)mainModule.getById(idParam);\r
+        Entity mediaType = ent.getMediaType();\r
+        MirMedia mediaHandler;\r
+\r
+        ServletContext ctx = MirPropertiesConfiguration.getContext();\r
+        String fName = ent.getId()+"."+mediaType.getValue("name");\r
+\r
+        mediaHandler = MediaHelper.getHandler(mediaType);\r
+        InputStream in = mediaHandler.getMedia(ent, mediaType);\r
+\r
+        res.setContentType(ctx.getMimeType(fName));\r
+        //important that before calling this res.getWriter was not called first\r
+        ServletOutputStream out = res.getOutputStream();\r
+\r
+        int read ;\r
+        byte[] buf = new byte[8 * 1024];\r
+        while((read = in.read(buf)) != -1) {\r
+          out.write(buf, 0, read);\r
+        }\r
+        in.close();\r
+        out.close();\r
+      }\r
+      catch (Throwable e) {\r
+        throw new ServletModuleFailure(e);\r
+      }\r
+    }\r
+    else logger.error("id not specified.");\r
+    // no exception allowed\r
+  }\r
+\r
+  public void getIcon(HttpServletRequest req, HttpServletResponse res) throws ServletModuleExc\r
+  {\r
+    String idParam = req.getParameter("id");\r
+    if (idParam!=null && !idParam.equals("")) {\r
+      try {\r
+        EntityUploadedMedia ent = (EntityUploadedMedia)mainModule.getById(idParam);\r
+        Entity mediaType = ent.getMediaType();\r
+        MirMedia mediaHandler;\r
+\r
+        ServletContext ctx = MirPropertiesConfiguration.getContext();\r
+        String fName = ent.getId()+"."+mediaType.getValue("name");\r
+\r
+        mediaHandler = MediaHelper.getHandler(mediaType);\r
+        InputStream in = mediaHandler.getIcon(ent);\r
+\r
+        res.setContentType(ctx.getMimeType(fName));\r
+        //important that before calling this res.getWriter was not called first\r
+        ServletOutputStream out = res.getOutputStream();\r
+\r
+        int read ;\r
+        byte[] buf = new byte[8 * 1024];\r
+        while((read = in.read(buf)) != -1) {\r
+          out.write(buf, 0, read);\r
+        }\r
+        in.close();\r
+        out.close();\r
+      }\r
+\r
+      catch (Throwable e) {\r
+        throw new ServletModuleFailure(e);\r
+      }\r
+    }\r
+    else logger.error("getIcon: id not specified.");\r
+    // no exception allowed\r
+  }\r
+\r
+}\r
+\r
+\r
index 06b8bb4..439a6ba 100755 (executable)
 
 package mircoders.storage;
 
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-import mir.log.LoggerWrapper;
-import mir.storage.Database;
-import mir.storage.StorageObject;
+import java.sql.Connection;\r
+import java.sql.SQLException;\r
+import java.sql.Statement;\r
+\r
+import freemarker.template.SimpleList;\r
+import mir.log.LoggerWrapper;\r
+import mir.storage.Database;\r
+import mir.storage.StorageObject;\r
 import mir.storage.StorageObjectFailure;
-import freemarker.template.SimpleList;
 
 /**
  * <b>This class implements the access to the comment-table for the
diff --git a/source/mircoders/storage/DatabaseCommentToMedia.java b/source/mircoders/storage/DatabaseCommentToMedia.java
new file mode 100755 (executable)
index 0000000..71befbb
--- /dev/null
@@ -0,0 +1,562 @@
+/*
+ * Copyright (C) 2001, 2002  The Mir-coders group
+ *
+ * This file is part of Mir.
+ *
+ * Mir is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Mir is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mir; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * In addition, as a special exception, The Mir-coders gives permission to link
+ * the code of this program with the com.oreilly.servlet library, any library
+ * licensed under the Apache Software License, The Sun (tm) Java Advanced
+ * Imaging library (JAI), The Sun JIMI library (or with modified versions of
+ * the above that use the same license as the above), and distribute linked
+ * combinations including the two.  You must obey the GNU General Public
+ * License in all respects for all of the code used other than the above
+ * mentioned libraries.  If you modify this file, you may extend this exception
+ * to your version of the file, but you are not obligated to do so.  If you do
+ * not wish to do so, delete this exception statement from your version.
+ */
+
+package mircoders.storage;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+
+import mir.entity.EntityList;
+import mir.log.LoggerWrapper;
+import mir.storage.Database;
+import mir.storage.StorageObject;
+import mir.storage.StorageObjectExc;
+import mir.storage.StorageObjectFailure;
+import mircoders.entity.EntityComment;
+import mircoders.entity.EntityUploadedMedia;
+
+/**
+ * <b>implements abstract DB connection to the comment_x_media SQL table
+ *
+ * @author RK, mir-coders group
+ * @version $Id: DatabaseCommentToMedia.java,v 1.1 2003/04/10 03:31:47 zapata Exp $
+ *
+ */
+
+public class DatabaseCommentToMedia extends Database implements StorageObject{
+
+  private static DatabaseCommentToMedia instance;
+
+  public static DatabaseCommentToMedia getInstance() {
+    if (instance == null) {
+      synchronized (DatabaseCommentToMedia.class) {
+        if (instance == null) {
+          instance = new DatabaseCommentToMedia();
+          instance.myselfDatabase = instance;
+        }
+      }
+    }
+    return instance;
+  }
+
+  private DatabaseCommentToMedia() {
+    super();
+
+    logger = new LoggerWrapper("Database.CommentToMedia");
+
+    hasTimestamp = false;
+    theTable = "comment_x_media";
+    theEntityClass = mir.entity.GenericEntity.class;
+  }
+
+  /**
+   * get all the media-files belonging to a comment entity
+   *
+   */
+  public EntityList getMedia(EntityComment comment) throws StorageObjectFailure {
+    EntityList returnList = null;
+    if (comment != null) {
+      // get all to_topic from media_x_topic
+      String id = comment.getId();
+      String subselect = "id in (select media_id from " + theTable +
+          " where comment_id=" + id + ")";
+
+      try {
+        // media should stay in uploaded order. this is especially important
+        // for photo stories which require a specific chronologic order.
+        // this is why we have the the second parameter "id"
+        returnList = DatabaseMedia.getInstance().selectByWhereClause(subselect,
+            "id", -1);
+      }
+      catch (Throwable e) {
+        logger.debug("-- get media failed " + e.toString());
+        throw new StorageObjectFailure("-- get media failed ", e);
+      }
+    }
+    return returnList;
+  }
+
+  public boolean hasMedia(EntityComment comment) throws StorageObjectFailure,
+      StorageObjectExc {
+    if (comment != null) {
+      try {
+        if (selectByWhereClause("comment_id=" + comment.getId(), -1).size() ==
+            0)
+          return false;
+        else
+          return true;
+      }
+      catch (Exception e) {
+        logger.error("DatabaseCommentToMedia.hasMedia: " + e.toString());
+        throw new StorageObjectFailure("DatabaseCommentToMedia.hasMedia: " +
+                                       e.toString(), e);
+      }
+    }
+    else {
+      logger.error("DatabaseCommentToMedia.hasMedia: comment == null");
+      throw new StorageObjectExc(
+          "DatabaseCommentToMedia.hasMedia: comment == null");
+    }
+  }
+
+  /**
+   * get all the audio belonging to a comment entity
+   *
+   */
+  public EntityList getAudio(EntityComment comment) throws StorageObjectFailure {
+    EntityList returnList = null;
+    if (comment != null) {
+      // get all to_topic from media_x_topic
+      String id = comment.getId();
+      //this is not supported by mysql
+      String subselect = "id in (select media_id from " + theTable +
+          " where comment_id=" + id + ")";
+
+      try {
+        // media should stay in uploaded order. this is especially important
+        // for photo stories which require a specific chronologic order.
+        // this is why we have the the second parameter "id"
+        returnList = DatabaseAudio.getInstance().selectByWhereClause(subselect,
+            "id", -1);
+      }
+      catch (Exception e) {
+        logger.error("DatabaseCommentToMedia.getAudio: " + e.toString());
+        throw new StorageObjectFailure("DatabaseCommentToMedia.getAudio: " +
+                                       e.toString(), e);
+      }
+    }
+    return returnList;
+  }
+
+  /**
+   * get all the video belonging to a comment entity
+   *
+   */
+  public EntityList getVideo(EntityComment comment) throws StorageObjectFailure {
+    EntityList returnList = null;
+    if (comment != null) {
+      // get all to_topic from media_x_topic
+      String id = comment.getId();
+      //this is not supported by mysql
+      String subselect = "id in (select media_id from " + theTable +
+          " where comment_id=" + id + ")";
+
+      try {
+        // media should stay in uploaded order. this is especially important
+        // for photo stories which require a specific chronologic order.
+        // this is why we have the the second parameter "id"
+        returnList = DatabaseVideo.getInstance().selectByWhereClause(subselect,
+            "id", -1);
+      }
+      catch (Exception e) {
+        logger.error("DatabaseCommentToMedia.getVideo: " + e.toString());
+        throw new StorageObjectFailure("DatabaseCommentToMedia.getVideo: " +
+                                       e.toString(), e);
+      }
+    }
+    return returnList;
+  }
+
+  /**
+   * get all the images belonging to a comment entity
+   *
+   */
+  public EntityList getImages(EntityComment comment) throws
+      StorageObjectFailure {
+    EntityList returnList = null;
+    if (comment != null) {
+      // get all to_topic from media_x_topic
+      String id = comment.getId();
+      //this is not supported by mysql
+      String subselect = "id in (select media_id from " + theTable +
+          " where comment_id=" + id + ")";
+
+      try {
+        // media should stay in uploaded order. this is especially important
+        // for photo stories which require a specific chronologic order.
+        // this is why we have the the second parameter "id"
+        returnList = DatabaseImages.getInstance().selectByWhereClause(subselect,
+            "id", -1);
+      }
+      catch (Exception e) {
+        logger.error("DatabaseCommentToMedia.getImages: " + e.toString());
+        throw new StorageObjectFailure("DatabaseCommentToMedia.getImages: " +
+                                       e.toString(), e);
+      }
+    }
+    return returnList;
+  }
+
+  /**
+   * get all the uploaded/other Media belonging to a comment entity
+   *
+   */
+  public EntityList getOther(EntityComment comment) throws StorageObjectFailure {
+    /** @todo this should only fetch published media / rk */
+
+    EntityList returnList = null;
+    if (comment != null) {
+      // get all to_topic from media_x_topic
+      String id = comment.getId();
+      //this is not supported by mysql
+      String subselect = "id in (select media_id from " + theTable +
+          " where comment_id=" + id + ")";
+
+      try {
+        // media should stay in uploaded order. this is especially important
+        // for photo stories which require a specific chronologic order.
+        // this is why we have the the second parameter "id"
+        returnList = DatabaseOther.getInstance().selectByWhereClause(subselect,
+            "id");
+      }
+      catch (Exception e) {
+        logger.error("DatabaseCommentToMedia.getOther: " + e.toString());
+        throw new StorageObjectFailure("DatabaseCommentToMedia.getOther: " + e.toString(), e);
+      }
+    }
+    return returnList;
+  }
+
+  /**
+   * get all the uploaded/other Media belonging to a comment entity
+   *
+   */
+  public EntityList getUploadedMedia(EntityComment comment) throws
+      StorageObjectFailure {
+    /** @todo this should only fetch published media / rk */
+
+    EntityList returnList = null;
+    if (comment != null) {
+      // get all to_topic from media_x_topic
+      String id = comment.getId();
+      //this is not supported by mysql
+      String subselect = "id in (select media_id from " + theTable +
+          " where comment_id=" + id + ")";
+
+      try {
+        returnList = DatabaseUploadedMedia.getInstance().selectByWhereClause(
+            subselect,
+            "id");
+      }
+      catch (Exception e) {
+        logger.error("DatabaseCommentToMedia.getUploadedMedia: " + e.toString());
+        throw new StorageObjectFailure(
+            "DatabaseCommentToMedia.getUploadedMedia: " + e.toString(), e);
+      }
+    }
+    return returnList;
+  }
+
+  public void setMedia(String commentId, String[] mediaId) throws
+      StorageObjectFailure {
+    if (commentId == null) {
+      return;
+    }
+    if (mediaId == null || mediaId[0] == null) {
+      return;
+    }
+    //first delete all row with comment_id=commentId
+    String sql = "delete from " + theTable + " where comment_id=" + commentId;
+
+    Connection con = null;
+    Statement stmt = null;
+    try {
+      con = getPooledCon();
+      // should be a preparedStatement because is faster
+      stmt = con.createStatement();
+      ResultSet rs = executeSql(stmt, sql);
+    }
+    catch (Exception e) {
+      logger.error("-- set media failed -- delete");
+      throw new StorageObjectFailure("-- set media failed -- delete", e);
+    }
+    finally {
+      freeConnection(con, stmt);
+    }
+
+    //now insert
+    //first delete all row with comment_id=commentId
+    for (int i = 0; i < mediaId.length; i++) {
+      sql = "insert into " + theTable + " (comment_id,media_id) values ("
+          + commentId + "," + mediaId[i] + ")";
+      try {
+        con = getPooledCon();
+        // should be a preparedStatement because is faster
+        stmt = con.createStatement();
+        int rs = executeUpdate(stmt, sql);
+      }
+      catch (Exception e) {
+        logger.error("-- set topics failed -- insert");
+        throw new StorageObjectFailure("-- set topics failed -- insert ", e);
+      }
+      finally {
+        freeConnection(con, stmt);
+      }
+    }
+  }
+
+  public void addMedia(String commentId, String mediaId) throws
+      StorageObjectFailure {
+    if (commentId == null && mediaId == null) {
+      return;
+    }
+
+    Connection con = null;
+    Statement stmt = null;
+    //now insert
+
+    String sql = "insert into " + theTable + " (comment_id,media_id) values ("
+        + commentId + "," + mediaId + ")";
+    try {
+      con = getPooledCon();
+      // should be a preparedStatement because is faster
+      stmt = con.createStatement();
+      int rs = executeUpdate(stmt, sql);
+    }
+    catch (Exception e) {
+      logger.error("-- add media failed -- insert");
+      throw new StorageObjectFailure("-- add media failed -- insert ", e);
+    }
+    finally {
+      freeConnection(con, stmt);
+    }
+  }
+
+  public void setMedia(String commentId, String mediaId) throws
+      StorageObjectFailure {
+    if (commentId == null && mediaId == null) {
+      return;
+    }
+    //first delete all row with comment_id=commentId
+    String sql = "delete from " + theTable + " where comment_id=" + commentId;
+
+    Connection con = null;
+    Statement stmt = null;
+    try {
+      con = getPooledCon();
+      // should be a preparedStatement because is faster
+      stmt = con.createStatement();
+      int rs = executeUpdate(stmt, sql);
+    }
+    catch (Exception e) {
+      logger.error("-- set media failed -- delete");
+      throw new StorageObjectFailure("-- set media failed -- delete ", e);
+    }
+    finally {
+      freeConnection(con, stmt);
+    }
+
+    //now insert
+    //first delete all row with comment_id=commentId
+
+    sql = "insert into " + theTable + " (comment_id,media_id) values ("
+        + commentId + "," + mediaId + ")";
+    try {
+      con = getPooledCon();
+      // should be a preparedStatement because is faster
+      stmt = con.createStatement();
+      int rs = executeUpdate(stmt, sql);
+    }
+    catch (Exception e) {
+      logger.error("-- set media failed -- insert");
+      throw new StorageObjectFailure("-- set media failed -- insert ", e);
+    }
+    finally {
+      freeConnection(con, stmt);
+    }
+  }
+
+  public void deleteByCommentId(String commentId) throws StorageObjectFailure {
+    if (commentId == null) {
+      //theLog.printDebugInfo("-- delete topics failed -- no comment id");
+      return;
+    }
+    //delete all row with comment_id=commentId
+    String sql = "delete from " + theTable + " where comment_id=" + commentId;
+
+    Connection con = null;
+    Statement stmt = null;
+    try {
+      con = getPooledCon();
+      // should be a preparedStatement because is faster
+      stmt = con.createStatement();
+      int rs = executeUpdate(stmt, sql);
+    }
+    catch (Exception e) {
+      logger.error("-- delete by commentId failed  ");
+      throw new StorageObjectFailure(
+          "-- delete by comment id failed -- delete ", e);
+    }
+    finally {
+      freeConnection(con, stmt);
+    }
+  }
+
+  public void deleteByMediaId(String mediaId) throws StorageObjectFailure {
+    if (mediaId == null) {
+      //theLog.printDebugInfo("-- delete topics failed -- no topic id");
+      return;
+    }
+    //delete all row with comment_id=commentId
+    String sql = "delete from " + theTable + " where media_id=" + mediaId;
+
+    Connection con = null;
+    Statement stmt = null;
+    try {
+      con = getPooledCon();
+      // should be a preparedStatement because is faster
+      stmt = con.createStatement();
+      int rs = executeUpdate(stmt, sql);
+      logger.debug("-- delete media success ");
+    }
+    catch (Exception e) {
+      logger.error("-- delete media failed ");
+      throw new StorageObjectFailure("-- delete by media id failed -- ", e);
+    }
+    finally {
+      freeConnection(con, stmt);
+    }
+  }
+
+  public void delete(String commentId, String mediaId) throws
+      StorageObjectFailure {
+    if (mediaId == null || commentId == null) {
+      logger.debug("-- delete media failed -- missing parameter");
+      return;
+    }
+    //delete all row with comment_id=commentId and media_id=mediaId
+    String sql = "delete from " + theTable + " where media_id=" + mediaId +
+        " and comment_id= " + commentId;
+
+    Connection con = null;
+    Statement stmt = null;
+    try {
+      con = getPooledCon();
+      // should be a preparedStatement because is faster
+      stmt = con.createStatement();
+      int rs = executeUpdate(stmt, sql);
+      logger.debug("-- delete comment_x_media success ");
+    }
+    catch (Exception e) {
+      logger.error("-- delete comment_x_media failed ");
+      throw new StorageObjectFailure("-- delete comment_x_media failed -- ", e);
+    }
+    finally {
+      freeConnection(con, stmt);
+    }
+  }
+
+  public EntityList getComment(EntityUploadedMedia media) throws
+      StorageObjectFailure {
+    EntityList returnList = null;
+    if (media != null) {
+      String id = media.getId();
+      String select = "select comment_id from " + theTable + " where media_id=" +
+          id;
+
+      // execute select statement
+      Connection con = null;
+      Statement stmt = null;
+      try {
+        con = getPooledCon();
+        // should be a preparedStatement because is faster
+        stmt = con.createStatement();
+        ResultSet rs = executeSql(stmt, select);
+        if (rs != null) {
+          String mediaSelect = "id IN (";
+          boolean first = true;
+          while (rs.next()) {
+            if (first == false)
+              mediaSelect += ",";
+            mediaSelect += rs.getString(1);
+            first = false;
+          }
+          mediaSelect += ")";
+          if (first == false)
+            returnList = DatabaseComment.getInstance().selectByWhereClause(
+                mediaSelect, -1);
+        }
+      }
+      catch (Exception e) {
+        logger.error("-- get comment failed");
+        throw new StorageObjectFailure("-- get comment failed -- ", e);
+      }
+      finally {
+        freeConnection(con, stmt);
+      }
+    }
+    return returnList;
+  }
+
+  /**
+   * Returns a EntityList with all comment-objects having a relation to a media
+   */
+
+  public EntityList getComment() throws StorageObjectFailure {
+    EntityList returnList = null;
+
+    String select = "select distinct comment_id from " + theTable;
+    // execute select statement
+    Connection con = null;
+    Statement stmt = null;
+    try {
+      con = getPooledCon();
+      // should be a preparedStatement because is faster
+      stmt = con.createStatement();
+      ResultSet rs = executeSql(stmt, select);
+      if (rs != null) {
+        String mediaSelect = "id IN (";
+        boolean first = true;
+        while (rs.next()) {
+          if (first == false)
+            mediaSelect += ",";
+          mediaSelect += rs.getString(1);
+          first = false;
+        }
+        mediaSelect += ")";
+        if (first == false)
+          returnList = DatabaseComment.getInstance().selectByWhereClause(
+              mediaSelect, "webdb_lastchange desc");
+      }
+    }
+    catch (Exception e) {
+      logger.error("-- get comment failed");
+      throw new StorageObjectFailure("-- get comment failed -- ", e);
+    }
+    finally {
+      freeConnection(con, stmt);
+    }
+
+    return returnList;
+  }
+
+}
index 296f540..485a834 100755 (executable)
                </if>
        </if>
 </function>
+
+
+
+<comment>functions to show media for an article/comment edit page</comment>
+<function showArticleAttachments(anArticle)>
+  <call showAttachments(1, anArticle)>
+</function>
+
+<function showCommentAttachments(aComment)>
+  <call showAttachments(0, aComment)>
+</function>
+
+<function showAttachments(anIsArticle, anObject)>
+  <if anIsArticle=="1">
+    <assign objectKey="articleid">
+    <assign objectModule="Content">
+  <else>
+    <assign objectKey="commentid">
+    <assign objectModule="Comment">
+  </if>
+
+  <table cellspacing="2" cellpadding="2">
+               <tr>
+                       <td class="table_head" colspan="2">
+                               ${lang("content.attachments")}
+                       </td>
+               </tr>
+
+               <tr>
+                       <td align=right valign=top class="table_left">
+                               ${lang("content.images")}: 
+                       </td>
+                       <td align="left" valign="top" class="listrow2">
+                               <a href="${config.actionRoot}?module=Images&do=list&${objectKey}=${anObject.id}">[+] ${lang("content.addimage")}</a> |
+                               <a href="${config.actionRoot}?module=Images&do=add&${objectKey}=${anObject.id}">${lang("content.uploadimage")}</a>
+                       </td>
+               </tr>
+               <list anObject.to_all_media_images as m>
+                       <tr>
+                       <td align=right valign=top>
+                               <a href="${config.actionRoot}?module=Images&do=edit&id=${m["id"]}"><img src="${config.actionRoot}?module=Images&do=getIcon&id=${m["id"]}" alt="edit" border="0"></a>&nbsp;
+                       </td>
+                       <td align="left" valign="top">
+                               <a href="${config.actionRoot}?module=${objectModule}&do=dettach&${objectKey}=${anObject.id}&mid=${m["id"]}">[-] ${lang("delete")}</a>
+                       </td>
+                       </tr>
+               </list>
+               
+
+               <tr>
+                       <td align=right valign=top class="table_left">
+                       ${lang("content.audio")}:
+                       </td>
+                       <td align="left" valign="top" class="listrow2">
+                               <a href="${config.actionRoot}?module=Audio&do=list&${objectKey}=${anObject.id}">[+] ${lang("content.addaudio")}</a> |
+                               <a href="${config.actionRoot}?module=Audio&do=add&${objectKey}=${anObject.id}">${lang("content.uploadaudio")}</a>
+                       </td>
+               </tr>
+               <list anObject.to_all_media_audio as m>
+                       <tr>
+                       <td align=right valign=top>
+                               <a href="${config.actionRoot}?module=Audio&do=edit&id=${m["id"]}"><img src="${config.docRoot}/img/${m["big_icon"]}" alt="edit" border="0"></a>&nbsp;
+                       </td>
+                       <td align="left" valign="top">
+                               <a href="${config.actionRoot}?module=${objectModule}&do=dettach&${objectKey}=${anObject.id}&mid=${m["id"]}">[-] ${lang("delete")}</a>
+                       </td>
+                       </tr>
+               </list>
+               
+
+               <tr>
+                       <td align=right valign=top class="table_left">
+                               ${lang("content.video")}:
+                       </td>
+                       <td  align="left" valign="top" class="listrow2">
+                               <a href="${config.actionRoot}?module=Video&do=list&${objectKey}=${anObject.id}">[+] ${lang("content.addvideo")}</a> |
+                               <a href="${config.actionRoot}?module=Video&do=add&${objectKey}=${anObject.id}">${lang("content.uploadvideo")}</a>
+                       </td>
+               </tr>
+               <list anObject.to_all_media_video as m>
+                       <tr>
+                       <td align=right valign=top>
+                               <a href="${config.actionRoot}?module=Video&do=edit&id=${m["id"]}"><img src="${config.docRoot}/img/${m["big_icon"]}" alt="edit" border="0"></a>&nbsp;                            
+                       </td>
+                       <td align="left" valign="top">
+                               <a href="${config.actionRoot}?module=${objectModule}&do=dettach&${objectKey}=${anObject.id}&mid=${m["id"]}">[-] ${lang("delete")}</a>
+                       </td>
+                       </tr>
+               </list>
+               
+               <tr>
+                       <td align=right valign=top class="table_left">
+                               ${lang("content.other")}:
+                       </td>
+                       <td align="left" valign="top" class="listrow2">
+                       <a href="${config.actionRoot}?module=OtherMedia&do=list&${objectKey}=${anObject.id}">[+] ${lang("content.addother")}</a> |
+                       <a href="${config.actionRoot}?module=OtherMedia&do=add&${objectKey}=${anObject.id}">${lang("content.uploadother")}</a>
+                       </td>
+               </tr>
+               <list anObject.to_all_media_other as m>
+                       <tr>
+                       <td align=right valign=top">
+                       <a href="${config.actionRoot}?module=Video&do=edit&id=${m["id"]}"><img src="${config.docRoot}/img/${m["big_icon"]}" alt="edit" border="0"></a>&nbsp;    
+                       </td>
+                       <td align="left" valign="top">
+                               <a href="${config.actionRoot}?module=${objectModule}&do=dettach&${objectKey}=${anObject.id}&mid=${m["id"]}">[-] ${lang("delete")}</a>
+                       </td>
+                       </tr>
+               </list>
+  </table>
+</function>  
+
+
index ccd0924..04261fb 100755 (executable)
@@ -9,7 +9,8 @@
 
 <input type="hidden" name="module" value="${module}">
 <input type="hidden" name="do" value="list">
-<input type="hidden" name="cid" value="${data.cid}">
+<input type="hidden" name="articleid" value="${data.articleid}">
+<input type="hidden" name="commentid" value="${data.commentid}">
 
 <table border="0" cellspacing="2" cellpadding="2">
        <tr>
                        ${entry.creator}&nbsp;
                </td>
                <td>&nbsp;
-                       <if data.cid>
-                               <a href="${config.actionRoot}?module=Content&do=attach&mid=${entry.id}&cid=${data.cid}">${lang("attach")}</a>
+                       <if data.articleid>
+                               <a href="${config.actionRoot}?module=Content&do=attach&mid=${entry.id}&articleid=${data.articleid}">${lang("attach")}</a>
                        <else>
-                               <a href="${config.actionRoot}?module=${module}&do=delete&id=${entry.id}&query_text=${utility.encodeHTML(data.query_text_encoded)}&query_field=${utility.encodeHTML(data.query_field)}&query_is_published=${data.query_is_published}&query_media_folder=${data.query_media_folder}&offset=${data.offset}">${lang("delete")}</a>
+                         <if data.commentid>
+                                 <a href="${config.actionRoot}?module=Comment&do=attach&mid=${entry.id}&commentid=${data.commentid}">${lang("attach")}</a>
+                               <else>
+                               <a href="${config.actionRoot}?module=${module}&do=delete&id=${entry.id}&query_text=${utility.encodeHTML(data.query_text_encoded)}&query_field=${utility.encodeHTML(data.query_field)}&query_is_published=${data.query_is_published}&query_media_folder=${data.query_media_folder}&offset=${data.offset}">${lang("delete")}</a>
                        | <a href="${config.actionRoot}?module=${module}&do=edit&id=${entry.id}">${lang("edit")}</a>
+         </if>
                        </if>
                </td>
        </tr>
        <tr>
                <td>
                        <if data.prev>
-                               <a href="${config.actionRoot}?module=${module}&do=list&query_text=${data.query_text_encoded}&query_field=${data.query_field}&query_is_published=${data.query_is_published}&query_media_folder=${data.query_media_folder}&offset=${data.prev}&prev=zur&uuml;ck&cid=${data.cid}">${lang("list.previous")}</a>&nbsp;
+                               <a href="${config.actionRoot}?module=${module}&do=list&query_text=${data.query_text_encoded}&query_field=${data.query_field}&query_is_published=${data.query_is_published}&query_media_folder=${data.query_media_folder}&offset=${data.prev}&prev=zur&uuml;ck&articleid=${data.articleid}&commentid=${data.commentid}">${lang("list.previous")}</a>&nbsp;
                        </if>
                        <if data.next>
-                               <a href="${config.actionRoot}?module=${module}&do=list&query_text=${data.query_text_encoded}&query_field=${data.query_field}&query_is_published=${data.query_is_published}&query_media_folder=${data.query_media_folder}&offset=${data.next}&next=weiter&cid=${data.cid}">${lang("list.next")}</a>
+                               <a href="${config.actionRoot}?module=${module}&do=list&query_text=${data.query_text_encoded}&query_field=${data.query_field}&query_is_published=${data.query_is_published}&query_media_folder=${data.query_media_folder}&offset=${data.next}&next=weiter&articleid=${data.articleid}&commentid=${data.commentid}">${lang("list.next")}</a>
                        </if>
                </td>
        </tr>
index 215a51a..d916214 100755 (executable)
@@ -19,6 +19,9 @@ function openWin(url) {
        <if data.articleid>
                <input type="hidden" name="articleid" value="${data.articleid}">
        </if>
+       <if data.commentid>
+               <input type="hidden" name="commentid" value="${data.commentid}">
+       </if>
        <table border="0">
                <tr>
                        <td align="right" class="table_left">
@@ -37,6 +40,9 @@ function openWin(url) {
        <if data.articleid>
                <input type="hidden" name="articleid" value="${data.articleid}">
        </if>
+       <if data.commentid>
+               <input type="hidden" name="commentid" value="${data.commentid}">
+       </if>
        <input type="hidden" name="where" value="${data.where}">
        <input type="hidden" name="offset" value="${data.offset}">
        <input type="hidden" name="order" value="${data.order}">
index 2673cba..517f6fe 100755 (executable)
       
     <form method="post" action="${config.actionRoot}">
        <input type="hidden" name="module" value="Comment">
-       <input type="hidden" name="id" value="${utility.encodeHTML(data.id)}">
-       <input type="hidden" name="date" value="${utility.encodeHTML(data.date)}">
-       <input type="hidden" name="to_media" value="${utility.encodeHTML(data.to_media)}">
-       <if new> 
+       <input type="hidden" name="id" value="${utility.encodeHTML(comment.id)}">
+       <if new=="1"> 
          <input type="hidden" name="do" value="insert">
        <else>   
          <input type="hidden" name="do" value="update">
@@ -30,7 +28,7 @@
             ${lang("comment.date")}
           </td>
           <td class="listrow2">
-            ${utility.encodeHTML(utility.encodeHTML(data.webdb_create))}
+            ${utility.encodeHTML(utility.encodeHTML(comment.webdb_create))}
           </td>
         </tr>
       
           </td>
           <td class="listrow2">
             <select name="to_comment_status">
-              <list extra.comment_status_values as a>
-                <option value="${a.key}" <if (a.key == data.to_comment_status)>selected</if>>${lang("commentstatus."+a.value)}</option>
+              <list commentstatuses as a>
+                <option value="${a.id}" <if (a.id == comment.to_comment_status)>selected</if>>${lang("commentstatus."+a.name)}</option>
               </list>
             </select>
           </td>
         </tr>
        
         
-               <call TextInputTableRow (lang("comment.title"), 40, 255, "title", utility.encodeHTML(data.title))>
-               <call TextInputTableRow (lang("comment.creator"), 40, 80, "creator", utility.encodeHTML(data.creator))>
-               <call TextInputTableRow (lang("comment.url"), 40, 255, "main_url", utility.encodeHTML(data.main_url))>
-               <call TextInputTableRow (lang("comment.email"), 40, 80, "email", utility.encodeHTML(data.email))>
-               <call TextInputTableRow (lang("comment.phone"), 40, 80, "phone", utility.encodeHTML(data.phone))>
-               <call TextInputTableRow (lang("comment.address"), 40, 80, "address", utility.encodeHTML(data.address))>
+               <call TextInputTableRow (lang("comment.title"), 40, 255, "title", utility.encodeHTML(comment.title))>
+               <call TextInputTableRow (lang("comment.creator"), 40, 80, "creator", utility.encodeHTML(comment.creator))>
+               <call TextInputTableRow (lang("comment.url"), 40, 255, "main_url", utility.encodeHTML(comment.main_url))>
+               <call TextInputTableRow (lang("comment.email"), 40, 80, "email", utility.encodeHTML(comment.email))>
+               <call TextInputTableRow (lang("comment.phone"), 40, 80, "phone", utility.encodeHTML(comment.phone))>
+               <call TextInputTableRow (lang("comment.address"), 40, 80, "address", utility.encodeHTML(comment.address))>
                
        
         <tr>
@@ -63,8 +61,8 @@
          </td>
           <td class="listrow2">
             <select name="to_language">
-              <list extra.languages as l>
-                <option value="${l.key}" <if (l.key == data.to_language)>selected</if>>${l.value}</option>
+              <list languages as l>
+                <option value="${l.id}" <if (l.id == comment.to_language)>selected</if>>${l.name}</option>
               </list>
             </select>
           </td>
         <tr>
           <td align="right" class="table_left" valign="top">
             ${lang("comment.text")}<br>
-            ${lang("comment.html")}<input type="checkbox" name="is_html" value="1"<if data.is_html=="1"> checked</if>>
+            ${lang("comment.html")}<input type="checkbox" name="is_html" value="1"<if comment.is_html=="1"> checked</if>>
           </td>
           <td class="listrow2">
-            <textarea cols="60" rows="10" name="description" wrap="virtual">${utility.encodeHTML(data.description)}</textarea>
+            <textarea cols="60" rows="10" name="description" wrap="virtual">${utility.encodeHTML(comment.description)}</textarea>
           </td>
         </tr>
         <tr>
           <td colspan="2" align="right" class="table_foot" > 
             <span class="text">
-             ${lang("comment.published")} <input type="checkbox" name="is_published" value="1" <if data.is_published=="1"> checked</if>>
-             <if new>
+             ${lang("comment.published")} <input type="checkbox" name="is_published" value="1" <if comment.is_published=="1"> checked</if>>
+             <if new=="1">
                 <input type="submit" name="save" value="${lang("insert")}">
               <else>
                 <input type="submit" name="save" value="${lang("save")}">
           </td>
         </tr>
       </table>
+
+<if new=="0">
+
+<table width="90%" cellspacing="0" cellpadding="0">
+
+<tr>
+<comment>
+<td align="left" valign="top">
+<table cellspacing="3" cellpadding="2">
+       <tr>
+               <td class="table_head" colspan="2">
+                       ${lang("content.family")}
+               </td>
+       </tr>
+               
+       <tr>
+               <td align=right valign=top class="table_left">
+                       ${lang("content.parent")}:
+               </td>
+               <td align="left" valign="top" class="listrow2">
+                       <if article.parent>
+                               <b>${utility.encodeHTML(article.parent.title)}</b><br>
+                               <a href="${config.actionRoot}?module=Content&do=edit&id=${article.parent.id}&returnurl=${utility.encodeURI(thisurl)}">${lang("content.viewparent")}</a> |
+                               <a href="${config.actionRoot}?module=Content&do=clearparent&id=${article.id}&returnurl=${utility.encodeURI(thisurl)}">${lang("content.clearparent")}</a> |
+                       </if>    
+                               &nbsp;<a href="${config.actionRoot}?module=Content&do=selectparent&id=${article.id}&returnurl=${utility.encodeURI(thisurl)}">${lang("content.selectparent")}</a>
+               </td>
+       </tr>
+               
+       <tr>
+               <td align=right valign=top class="table_left">
+                       ${lang("content.children")}:
+               </td>
+               <td align="left" valign="top" class="listrow2">
+                       <a href="${config.actionRoot}?module=Content&do=listchildren&article_id=${article.id}">${lang("content.viewchildren")}</a>
+               </td>
+       </tr>
+</table>
+
+</td>
+</comment>
+<td align="left" valign="top">
+<call showCommentAttachments(comment)>
+</td>
+</tr>
+</table>
+
+</if>          
+
     </form>
        
         <p>
index 85be6bf..944270a 100755 (executable)
@@ -21,8 +21,8 @@
 <table width="90%" cellspacing="3" cellpadding="2">
        <tr>
                <td align="left" valign="top">
-                       <if !data.new>
-                               <a href="${config.actionRoot}?module=Comment&do=articlecomments&articleid=${data.id}">[ ${lang("content.comments")} ]</a>
+                       <if new=="0">
+                               <a href="${config.actionRoot}?module=Comment&do=articlecomments&articleid=${article.id}&returnurl=${thisurl}">[ ${lang("content.comments")} ]</a>
                        </if>
                </td>
                <td align="right" valign="top">
 
 </td>
 <td align="right" valign="top">
-
-<table cellspacing="2" cellpadding="2">
-               <tr>
-                       <td class="table_head" colspan="2">
-                               ${lang("content.attachments")}
-                       </td>
-               </tr>
-
-               <tr>
-                       <td align=right valign=top class="table_left">
-                               ${lang("content.images")}: 
-                       </td>
-                       <td align="left" valign="top" class="listrow2">
-                               <a href="${config.actionRoot}?module=Images&do=list&cid=${article.id}">[+] ${lang("content.addimage")}</a> |
-                               <a href="${config.actionRoot}?module=Images&do=add&articleid=${article.id}">${lang("content.uploadimage")}</a>
-                       </td>
-               </tr>
-               <list article.to_media_images as m>
-                       <tr>
-                       <td align=right valign=top>
-                               <a href="${config.actionRoot}?module=Images&do=edit&id=${m["id"]}"><img src="${config.actionRoot}?module=Images&do=getIcon&id=${m["id"]}" alt="edit" border="0"></a>&nbsp;
-                       </td>
-                       <td align="left" valign="top">
-                               <a href="${config.actionRoot}?module=Content&do=dettach&cid=${article.id}&mid=${m["id"]}">[-] ${lang("delete")}</a>
-                       </td>
-                       </tr>
-               </list>
-               
-
-               <tr>
-                       <td align=right valign=top class="table_left">
-                       ${lang("content.audio")}:
-                       </td>
-                       <td align="left" valign="top" class="listrow2">
-                               <a href="${config.actionRoot}?module=Audio&do=list&cid=${article.id}">[+] ${lang("content.addaudio")}</a> |
-                               <a href="${config.actionRoot}?module=Audio&do=add&articleid=${article.id}">${lang("content.uploadaudio")}</a>
-                       </td>
-               </tr>
-               <list article.to_media_audio as m>
-                       <tr>
-                       <td align=right valign=top>
-                               <a href="${config.actionRoot}?module=Audio&do=edit&id=${m["id"]}"><img src="${config.docRoot}/img/${m["big_icon"]}" alt="edit" border="0"></a>&nbsp;
-                       </td>
-                       <td align="left" valign="top">
-                               <a href="${config.actionRoot}?module=Content&do=dettach&cid=${article.id}&mid=${m["id"]}">[-] ${lang("delete")}</a>
-                       </td>
-                       </tr>
-               </list>
-               
-
-               <tr>
-                       <td align=right valign=top class="table_left">
-                               ${lang("content.video")}:
-                       </td>
-                       <td  align="left" valign="top" class="listrow2">
-                               <a href="${config.actionRoot}?module=Video&do=list&cid=${article.id}">[+] ${lang("content.addvideo")}</a> |
-                               <a href="${config.actionRoot}?module=Video&do=add&articleid=${article.id}">${lang("content.uploadvideo")}</a>
-                       </td>
-               </tr>
-               <list article.to_media_video as m>
-                       <tr>
-                       <td align=right valign=top>
-                               <a href="${config.actionRoot}?module=Video&do=edit&id=${m["id"]}"><img src="${config.docRoot}/img/${m["big_icon"]}" alt="edit" border="0"></a>&nbsp;                            
-                       </td>
-                       <td align="left" valign="top">
-                               <a href="${config.actionRoot}?module=Content&do=dettach&cid=${article.id}&mid=${m["id"]}">[-] ${lang("delete")}</a>
-                       </td>
-                       </tr>
-               </list>
-               
-               <tr>
-                       <td align=right valign=top class="table_left">
-                               ${lang("content.other")}:
-                       </td>
-                       <td align="left" valign="top" class="listrow2">
-                       <a href="${config.actionRoot}?module=OtherMedia&do=list&cid=${article.id}">[+] ${lang("content.addother")}</a> |
-                       <a href="${config.actionRoot}?module=OtherMedia&do=add&articleid=${article.id}">${lang("content.uploadother")}</a>
-                       </td>
-               </tr>
-               <list article.to_media_other as m>
-                       <tr>
-                       <td align=right valign=top">
-                       <a href="${config.actionRoot}?module=Video&do=edit&id=${m["id"]}"><img src="${config.docRoot}/img/${m["big_icon"]}" alt="edit" border="0"></a>&nbsp;    
-                       </td>
-                       <td align="left" valign="top">
-                               <a href="${config.actionRoot}?module=Content&do=dettach&cid=${article.id}&mid=${m["id"]}">[-] ${lang("delete")}</a>
-                       </td>
-                       </tr>
-               </list>
-
-</table>
-
+<call showArticleAttachments(article)>
 </td>
 </tr>
 </table>
index 623e733..d73d153 100755 (executable)
@@ -20,6 +20,10 @@ function openWin(url) {
        <if data.articleid>
                <input type="hidden" name="articleid" value="${data.articleid}">
        </if>
+       <if data.commentid>
+               <input type="hidden" name="commentid" value="${data.commentid}">
+       </if>
+       
        
        <table border="0">
                <tr>
@@ -41,6 +45,10 @@ function openWin(url) {
                <input type="hidden" name="articleid" value="${data.articleid}">
        </if>
 
+       <if data.commentid>
+               <input type="hidden" name="commentid" value="${data.commentid}">
+       </if>
+
        <input type="hidden" name="where" value="${data.where}">
        <input type="hidden" name="offset" value="${data.offset}">
        <input type="hidden" name="order" value="${data.order}">
index 7359b0e..1275130 100755 (executable)
@@ -63,11 +63,15 @@ function openWin(url) {
                        ${entry.creator}&nbsp;
                </td>
                <td>&nbsp;
-                       <if data.cid>
-                               <a href="${config.actionRoot}?module=Content&do=attach&mid=${entry.id}&cid=${data.cid}">${lang("attach")}</a>
+                       <if data.articleid>
+                               <a href="${config.actionRoot}?module=Content&do=attach&mid=${entry.id}&articleid=${data.articleid}">${lang("attach")}</a>
                        <else>
-                               <a href="${config.actionRoot}?module=Images&do=delete&id=${entry.id}&query_text=${utility.encodeHTML(data.query_text_encoded)}&query_field=${utility.encodeHTML(data.query_field)}&query_is_published=${data.query_is_published}&query_media_folder=${data.query_media_folder}&offset=${data.offset}">${lang("delete")}</a>
-                       | <a href="${config.actionRoot}?module=Images&do=edit&id=${entry.id}">${lang("edit")}</a>
+                       <if data.commentid>
+                               <a href="${config.actionRoot}?module=Comment&do=attach&mid=${entry.id}&commentid=${data.commentid}">${lang("attach")}</a>
+                       <else>
+                               <a href="${config.actionRoot}?module=Images&do=delete&id=${entry.id}&query_text=${utility.encodeHTML(data.query_text_encoded)}&query_field=${utility.encodeHTML(data.query_field)}&query_is_published=${data.query_is_published}&query_media_folder=${data.query_media_folder}&offset=${data.offset}">${lang("delete")}</a>
+                       | <a href="${config.actionRoot}?module=Images&do=edit&id=${entry.id}">${lang("edit")}</a>
+        </if>
                        </if>
                </td>
        </tr>
@@ -81,10 +85,10 @@ function openWin(url) {
        <tr>
                <td>
                        <if data.prev>
-                               <a href="${config.actionRoot}?module=Images&do=list&query_text=${data.query_text_encoded}&query_field=${data.query_field}&query_is_published=${data.query_is_published}&query_media_folder=${data.query_media_folder}&offset=${data.prev}&prev=zur&uuml;ck&cid=${data.cid}">${lang("list.previous")}</a>&nbsp;
+                               <a href="${config.actionRoot}?module=Images&do=list&query_text=${data.query_text_encoded}&query_field=${data.query_field}&query_is_published=${data.query_is_published}&query_media_folder=${data.query_media_folder}&offset=${data.prev}&prev=zur&uuml;ck&articleid=${data.articleid}&commentid=${data.commentid}">${lang("list.previous")}</a>&nbsp;
                        </if>
                        <if data.next>
-                               <a href="${config.actionRoot}?module=Images&do=list&query_text=${data.query_text_encoded}&query_field=${data.query_field}&query_is_published=${data.query_is_published}&query_media_folder=${data.query_media_folder}&offset=${data.next}&next=weiter&cid=${data.cid}">${lang("list.next")}</a>
+                               <a href="${config.actionRoot}?module=Images&do=list&query_text=${data.query_text_encoded}&query_field=${data.query_field}&query_is_published=${data.query_is_published}&query_media_folder=${data.query_media_folder}&offset=${data.next}&next=weiter&articleid=${data.articleid}&commentid=${data.commentid}">${lang("list.next")}</a>
                        </if>
                </td>
        </tr>
index 07e711e..a7e827b 100755 (executable)
@@ -19,6 +19,9 @@ function openWin(url) {
        <if data.articleid>
                <input type="hidden" name="articleid" value="${data.articleid}">
        </if>
+       <if data.commentid>
+               <input type="hidden" name="commentid" value="${data.commentid}">
+       </if>
        
        <table border="0">
                <tr>
@@ -39,6 +42,9 @@ function openWin(url) {
        <if data.articleid>
                <input type="hidden" name="articleid" value="${data.articleid}">
        </if>
+       <if data.commentid>
+               <input type="hidden" name="commentid" value="${data.commentid}">
+       </if>
        <input type="hidden" name="where" value="${data.where}">
        <input type="hidden" name="offset" value="${data.offset}">
        <input type="hidden" name="order" value="${data.order}">
index c63d920..71283a4 100755 (executable)
@@ -18,6 +18,9 @@ function openWin(url) {
        <if data.articleid>
                <input type="hidden" name="articleid" value="${data.articleid}">
        </if>
+       <if data.commentid>
+               <input type="hidden" name="commentid" value="${data.commentid}">
+       </if>
        <table border="0">
                <tr>
                        <td align="right" class="table_left">
@@ -36,6 +39,9 @@ function openWin(url) {
        <if data.articleid>
                <input type="hidden" name="articleid" value="${data.articleid}">
        </if>
+       <if data.commentid>
+               <input type="hidden" name="commentid" value="${data.commentid}">
+       </if>
        
        <input type="hidden" name="where" value="${data.where}">
        <input type="hidden" name="offset" value="${data.offset}">