prelim euskalherria localizer added + misc. work on producer nodes
authorzapata <zapata>
Mon, 20 May 2002 22:54:03 +0000 (22:54 +0000)
committerzapata <zapata>
Mon, 20 May 2002 22:54:03 +0000 (22:54 +0000)
21 files changed:
source/mir/entity/adapter/EntityAdapter.java
source/mir/entity/adapter/EntityAdapterDefinition.java
source/mir/generator/FreemarkerGenerator.java
source/mir/producer/EntityBatchingProducerNode.java [new file with mode: 0755]
source/mir/producer/EntityEnumeratingProducerNode.java
source/mir/producer/EntityModifyingProducerNode.java [new file with mode: 0755]
source/mir/producer/FileDateSettingProducerNode.java [new file with mode: 0755]
source/mir/producer/FileDeletingProducerNode.java [new file with mode: 0755]
source/mir/producer/FileOperationProducerNode.java [new file with mode: 0755]
source/mir/producer/MediaGeneratingProducerNode.java [new file with mode: 0755]
source/mir/producer/MediaProducerNode.java [new file with mode: 0755]
source/mir/producer/ScriptCallingProducerNode.java [new file with mode: 0755]
source/mir/util/DateToMapAdapter.java [new file with mode: 0755]
source/mir/util/ParameterExpander.java
source/mircoders/localizer/MirOpenPostingLocalizer.java
source/mircoders/localizer/basic/MirBasicOpenPostingLocalizer.java
source/mircoders/localizer/basic/MirBasicProducerLocalizer.java
source/mirlocal/euskalherria.indymedia.org/EHLocalizer.java [new file with mode: 0755]
source/mirlocal/euskalherria.indymedia.org/EHOpenPostingLocalizer.java [new file with mode: 0755]
source/mirlocal/euskalherria.indymedia.org/EHProducerLocalizer.java [new file with mode: 0755]
source/mirlocal/indymedia.nl/IndyNLProducerLocalizer.java

index dd63f81..3a0b76a 100755 (executable)
@@ -31,7 +31,7 @@ public class EntityAdapter implements Map {
     return entity.hashCode();
   }
 
-  protected Entity getEntity() {
+  public Entity getEntity() {
     return entity;
   }
 
index 1d96922..1c60e88 100755 (executable)
@@ -3,6 +3,7 @@ package mir.entity.adapter;
 import java.util.*;
 import mir.entity.*;
 import mir.storage.*;
+import mir.util.*;
 
 public class EntityAdapterDefinition {
   Map calculatedFields;
@@ -43,6 +44,7 @@ public class EntityAdapterDefinition {
     }
 
     public Object getValue(EntityAdapter anEntityAdapter) {
+
       Map result = new HashMap();
       String textValue = anEntityAdapter.getEntity().getValue(fieldName);
       Calendar calendar = GregorianCalendar.getInstance();
@@ -59,22 +61,28 @@ public class EntityAdapterDefinition {
 
           calendar.set(year, month, day);
           date = calendar.getTime();
+          ;
 
           result.put("date", date);
-          result.put("year", textValue.substring(0,4));
+          result.put("formatted", new DateToMapAdapter(date));
+
+/*          result.put("year", textValue.substring(0,4));
           result.put("month", textValue.substring(4,6));
           result.put("day", textValue.substring(6,8));
-        }
+*/        }
         catch (Throwable t) {
-          result.put("date", null);
+          result=null;
+/*          result.put("date", null);
           result.put("year", null);
           result.put("month", null);
           result.put("day", null);
-        }
+*/        }
       }
 
       return result;
+
     }
+
   }
 
   static protected Object getRelation(StorageObject aStorageObject, String aWhereClause, String anOrderByClause, EntityAdapterDefinition aDefinition) {
index 62e36bf..d4778ff 100755 (executable)
@@ -38,6 +38,8 @@ public class FreemarkerGenerator implements Generator {
            return null;
          if (anObject instanceof TemplateModel)
            return (TemplateModel) anObject;
+//       if (anObject instanceof Date)
+//         return new DateAdapter((Date) anObject);
          else if (anObject instanceof MessageResources)
            return new MessageMethodModel((MessageResources) anObject);
          else if (anObject instanceof String)
@@ -208,4 +210,21 @@ public class FreemarkerGenerator implements Generator {
       position=0;
     }
        }
+
+/*     private static class DateAdapter implements TemplateHashModel {
+         Date date;
+
+         private DateAdapter(Date aDate) {
+           date = aDate;
+         }
+
+         public boolean isEmpty() {
+           return false;
+         }
+
+         public TemplateModel get(String aKey) throws TemplateModelException {
+           return makeAdapter(new SimpleDateFormat(aKey).format(date));
+         }
+       }
+*/
 }
diff --git a/source/mir/producer/EntityBatchingProducerNode.java b/source/mir/producer/EntityBatchingProducerNode.java
new file mode 100755 (executable)
index 0000000..446404d
--- /dev/null
@@ -0,0 +1,109 @@
+/*package mir.producer;
+
+import java.util.*;
+import java.io.*;
+import mir.entity.adapter.*;
+import mir.entity.*;
+import mir.storage.*;
+import mir.util.*;
+
+//     abstract public int getSize(String where) throws SQLException,StorageObjectException;
+
+
+public class EntityBatchingProducerNode implements ProducerNode {
+  private Map verbs;
+  private EntityBatchingProducerNodeVerb defaultVerb;
+
+  private String key;
+  private StorageObject storage;
+  private EntityAdapterDefinition definition;
+  private String whereClause;
+  private String orderByClause;
+  private int nrArticlesPerBatch;
+  private int minNrArticlesInFirstBatch;
+  private ProducerNode batchSubNode;
+  private ProducerNode batchListSubNode;
+
+  public EntityBatchingProducerNode(
+        String aKey,
+        StorageObject aStorage,
+        EntityAdapterDefinition aDefinition,
+        String aWhereClause,
+        String anOrderByClause,
+        int aNrArticlesPerBatch,
+        int aMinNrArticlesInFirstBatch,
+        ProducerNode aBatchSubNode,
+        ProducerNode aBatchListSubNode) {
+
+    batchSubNode = aBatchSubNode;
+    batchListSubNode = aBatchListSubNode;
+
+    defaultVerb = null;
+    verbs = new HashMap();
+
+    key = aKey;
+    storage = aStorage;
+    definition = aDefinition;
+    whereClause = aWhereClause;
+    orderByClause = anOrderByClause;
+    nrArticlesPerBatch = aNrArticlesPerBatch;
+    minNrArticlesInFirstBatch = aMinNrArticlesInFirstBatch;
+  }
+
+  public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
+    EntityBatchingProducerNodeVerb verb = (EntityBatchingProducerNodeVerb) verbs.get(aVerb);
+    Iterator browser;
+
+    if (verb==null)
+      verb = defaultVerb;
+
+    if (verb==null)
+      throw new ProducerFailure("EntityBatchingProducerNode: unknown verb '"+aVerb+"'", null);
+
+    try {
+      browser = new EntityIteratorAdapter(
+          storage,
+          ParameterExpander.expandExpression( aValueMap, verb.whereClause ),
+          ParameterExpander.expandExpression( aValueMap, verb.orderByClause ),
+          -1,
+          definition );
+
+      while (browser.hasNext()) {
+        aLogger.println( verb.whereClause + ": next... ");
+        aValueMap.put(key, browser.next());
+        super.produce(aValueMap, aVerb, aLogger);
+      }
+    }
+    catch (Throwable t) {
+      throw new ProducerFailure(t.getMessage(), t);
+    }
+  };
+
+  public Set buildVerbSet() {
+    Set set;
+
+    set = super.buildVerbSet();
+    set.addAll(verbs.keySet());
+
+    return set;
+  };
+
+  public void addVerb(String aVerb, String aWhereClause, String anOrderByClause) {
+    verbs.put(aVerb, new EntityBatchingProducerNodeVerb(aWhereClause, anOrderByClause));
+  }
+
+
+// int nrPagesToGenerate
+//
+
+  private class EntityBatchingProducerNodeVerb {
+    int nrPagesToGenerate;
+
+    EntityBatchingProducerNodeVerb(String aWhereClause, String anOrderByClause) {
+      whereClause = aWhereClause;
+      orderByClause = anOrderByClause;
+    }
+  }
+}
+
+*/
\ No newline at end of file
index 7bc5caa..e0c4642 100755 (executable)
@@ -74,8 +74,6 @@ public class EntityEnumeratingProducerNode extends ProducerNodeDecorator {
   }
 
   private class EntityEnumeratingProducerNodeVerb {
-    StorageObject database;
-
     String whereClause;
     String orderByClause;
 
diff --git a/source/mir/producer/EntityModifyingProducerNode.java b/source/mir/producer/EntityModifyingProducerNode.java
new file mode 100755 (executable)
index 0000000..22e054b
--- /dev/null
@@ -0,0 +1,44 @@
+package mir.producer;
+
+import java.util.*;
+import java.io.*;
+import mir.entity.*;
+import mir.entity.adapter.*;
+import mir.util.*;
+
+
+public abstract class EntityModifyingProducerNode implements ProducerNode {
+  String entityExpression;
+  String entityField;
+  String valueExpression;
+
+  public EntityModifyingProducerNode(String anEntityExpression, String anEntityField, String aValueExpression) {
+    entityExpression = anEntityExpression;
+    entityField = anEntityField;
+    valueExpression = aValueExpression;
+  }
+
+  public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
+    Object entity;
+
+    try {
+      entity = ParameterExpander.findValueForKey( aValueMap, entityExpression );
+
+      if (entity instanceof EntityAdapter) {
+        ((EntityAdapter) entity).getEntity().setValueForProperty(entityField, valueExpression);
+        ((EntityAdapter) entity).getEntity().update();
+      }
+      else
+        throw new Exception( entityExpression + " does not evaluate to an entity");
+    }
+    catch (Throwable t) {
+      aLogger.println("Error while performing entity modifying operation: " + t.getMessage());
+
+      throw new ProducerFailure(t.getMessage(), t);
+    }
+  }
+
+  public Set buildVerbSet() {
+    return new HashSet();
+  }
+}
\ No newline at end of file
diff --git a/source/mir/producer/FileDateSettingProducerNode.java b/source/mir/producer/FileDateSettingProducerNode.java
new file mode 100755 (executable)
index 0000000..25a55a1
--- /dev/null
@@ -0,0 +1,35 @@
+package mir.producer;
+
+import java.util.*;
+import java.io.*;
+import mir.util.*;
+import mir.producer.*;
+import mir.generator.*;
+import mircoders.global.*;
+import mircoders.localizer.*;
+
+public class FileDateSettingProducerNode extends FileOperationProducerNode {
+  String dateExpression;
+
+  public FileDateSettingProducerNode(String aFileIdentifier, String aDateExpression) {
+    super(aFileIdentifier);
+
+    dateExpression = aDateExpression;
+  }
+
+  protected void perform(File aFile, Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
+    try {
+      Object date = ParameterExpander.findValueForKey( aValueMap, dateExpression );
+
+      if (!(date instanceof Date))
+        throw new ProducerFailure("FileDateSettingProducerNode: expression " + dateExpression + " does not evaluate to a Date!", null );
+
+      if (!aFile.setLastModified(((Date) date).getTime())) {
+        aLogger.print("Can't set date for " + aFile.getName());
+      }
+    }
+    catch (Throwable t) {
+      throw new ProducerFailure(t.getMessage(), t);
+    }
+  }
+}
\ No newline at end of file
diff --git a/source/mir/producer/FileDeletingProducerNode.java b/source/mir/producer/FileDeletingProducerNode.java
new file mode 100755 (executable)
index 0000000..cc6bd6a
--- /dev/null
@@ -0,0 +1,22 @@
+package mir.producer;
+
+import java.util.*;
+import java.io.*;
+import mir.util.*;
+import mir.producer.*;
+import mir.generator.*;
+import mircoders.global.*;
+import mircoders.localizer.*;
+
+public class FileDeletingProducerNode extends FileOperationProducerNode {
+
+  public FileDeletingProducerNode(String aFileIdentifier) {
+    super(aFileIdentifier);
+  }
+
+  protected void perform(File aFile, Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
+    if (!aFile.delete()) {
+      aLogger.print("Can't delete " + aFile.getName());
+    }
+  }
+}
\ No newline at end of file
diff --git a/source/mir/producer/FileOperationProducerNode.java b/source/mir/producer/FileOperationProducerNode.java
new file mode 100755 (executable)
index 0000000..df8e674
--- /dev/null
@@ -0,0 +1,39 @@
+package mir.producer;
+
+import java.util.*;
+import java.io.*;
+import mir.util.*;
+import mir.producer.*;
+import mir.generator.*;
+import mircoders.global.*;
+import mircoders.localizer.*;
+
+public abstract class FileOperationProducerNode implements ProducerNode {
+  String fileName;
+
+  public FileOperationProducerNode(String aFileName) {
+    fileName = aFileName;
+  }
+
+  protected abstract void perform(File aFile, Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure;
+
+  public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
+    String fileIdentifier;
+
+    try {
+      fileIdentifier = ParameterExpander.expandExpression( aValueMap, fileName );
+      File file = new File(fileIdentifier);
+
+      perform(file, aValueMap, aVerb, aLogger);
+    }
+    catch (Throwable t) {
+      aLogger.println("Error while performing file operation: " + t.getMessage());
+
+      throw new ProducerFailure(t.getMessage(), t);
+    }
+  }
+
+  public Set buildVerbSet() {
+    return new HashSet();
+  }
+}
\ No newline at end of file
diff --git a/source/mir/producer/MediaGeneratingProducerNode.java b/source/mir/producer/MediaGeneratingProducerNode.java
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/source/mir/producer/MediaProducerNode.java b/source/mir/producer/MediaProducerNode.java
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/source/mir/producer/ScriptCallingProducerNode.java b/source/mir/producer/ScriptCallingProducerNode.java
new file mode 100755 (executable)
index 0000000..61a1fb1
--- /dev/null
@@ -0,0 +1,37 @@
+package mir.producer;
+
+import java.io.*;
+import java.util.*;
+import mir.util.*;
+
+// ML: needs to be tested!
+
+public class ScriptCallingProducerNode implements ProducerNode  {
+  String scriptExpression;
+
+  public ScriptCallingProducerNode(String aScriptExpression) {
+    scriptExpression = aScriptExpression;
+  }
+
+  public void produce(Map aValueMap, String aVerb, PrintWriter aLogger) throws ProducerFailure {
+    String script;
+    Process process;
+    int returnValue;
+
+    try {
+      script = ParameterExpander.expandExpression( aValueMap, scriptExpression );
+      aLogger.println("Executing " + script + ":");
+
+      process = Runtime.getRuntime().exec(script);
+      returnValue = process.waitFor();
+      aLogger.println("Terminated successfully, return value = " + returnValue + ".");
+    }
+    catch (Throwable e) {
+      throw new ProducerFailure("Executing script failed: " + e.getMessage(), e);
+    }
+  }
+
+  public Set buildVerbSet() {
+    return new HashSet();
+  }
+}
diff --git a/source/mir/util/DateToMapAdapter.java b/source/mir/util/DateToMapAdapter.java
new file mode 100755 (executable)
index 0000000..425465e
--- /dev/null
@@ -0,0 +1,23 @@
+package mir.util;
+
+import java.util.*;
+import java.text.*;
+
+public class DateToMapAdapter extends AbstractMap {
+  Date date;
+
+  public DateToMapAdapter(Date aDate) {
+    date = aDate;
+  }
+
+  public Object get(Object aKey) {
+    if (aKey instanceof String) {
+      return new SimpleDateFormat((String) aKey).format(date);
+    }
+    else return null;
+  }
+
+  public Set entrySet() {
+    return new HashSet();
+  }
+}
\ No newline at end of file
index 63a2733..0a5876b 100755 (executable)
@@ -26,15 +26,12 @@ public class ParameterExpander {
     return result;
   }
 
-  public static String findValueForKey(Map aMap, String aKey) throws Exception {
-    Object node;
+  private static Object findNode(String aKey, Map aMap, List aParts) throws Exception {
     Iterator i;
-    List parts = splitString(aKey, NODE_SEPARATOR);
     String location = "";
+    Object node = aMap;
 
-    node = aMap;
-
-    i = parts.iterator();
+    i = aParts.iterator();
 
     while(i.hasNext()) {
       String part = (String) i.next();
@@ -56,14 +53,40 @@ public class ParameterExpander {
       }
     }
 
-    if (node instanceof Map) {
-      node = ((Map) node).get(DEFAULT_KEY);
-    }
+    return node;
+  }
+
+  public static Object findValueForKey(Map aMap, String aKey) throws Exception {
+    Object node;
+    List parts = splitString(aKey, NODE_SEPARATOR);
+
+    node = findNode(aKey, aMap, parts);
+
+    return node;
+  }
+
+  public static String findStringForKey(Map aMap, String aKey) throws Exception {
+    Object expandedValue = findValueForKey(aMap, aKey);
 
-    if (!(node instanceof String))
-      throw new ParameterExpanderExc( "Can't expand key {1}: {2} is not a string but a {3}", new Object[]{aKey,location,node.getClass().getName()} );
+    if (!(expandedValue instanceof String))
+      throw new ParameterExpanderExc( "Value of key is not a string but a {1}", new Object[]{expandedValue.getClass().getName()} );
 
-    return (String) node;
+    return (String) expandedValue;
+  }
+
+  public static void setValueForKey(Map aMap, String aKey, Object aValue) throws Exception {
+    List parts = splitString(aKey, NODE_SEPARATOR);
+
+    String key = (String) parts.get(parts.size()-1);
+    parts.remove(parts.size()-1);
+
+    Object node=findNode(aKey, aMap, parts);
+
+    if (node instanceof Map) {
+      ((Map) node).put(key, aValue);
+    }
+    else
+      throw new ParameterExpanderExc( "Can't set key {1}: not inside a Map", new Object[]{aKey} );
   }
 
   public static String expandExpression(Map aMap, String anExpression) throws Exception {
@@ -84,7 +107,7 @@ public class ParameterExpander {
         if (anExpression.charAt(position+1) == '{') {
           endOfNamePosition=anExpression.indexOf('}', position);
           if (endOfNamePosition>=0) {
-            result.append(findValueForKey(aMap, anExpression.substring(position+2, endOfNamePosition)));
+            result.append(findStringForKey(aMap, anExpression.substring(position+2, endOfNamePosition)));
             previousPosition=endOfNamePosition+1;
           }
           else {
@@ -103,6 +126,7 @@ public class ParameterExpander {
     return result.toString();
   }
 
+
   public static class ParameterExpanderExc extends Exc {
     public ParameterExpanderExc(String msg, Object[] objects) {
       super(msg, objects);
index 001833e..0f818c9 100755 (executable)
@@ -1,6 +1,11 @@
 package mircoders.localizer;
 
+import java.util.*;
+import javax.servlet.http.*;
+
 public interface MirOpenPostingLocalizer {
   public void afterContentPosting();
   public void afterCommentPosting();
+
+  public String chooseOpenPostingLanguage(HttpServletRequest req);
 }
index ac9854f..805b117 100755 (executable)
@@ -1,5 +1,8 @@
 package mircoders.localizer.basic;
 
+import java.util.*;
+import javax.servlet.http.*;
+
 import mircoders.localizer.*;
 import mircoders.global.*;
 
@@ -17,4 +20,10 @@ public class MirBasicOpenPostingLocalizer implements MirOpenPostingLocalizer {
     MirGlobal.producerEngine().addJob("content", "new");
     MirGlobal.producerEngine().addJob("synchronization", "run");
   }
+
+  public String chooseOpenPostingLanguage(HttpServletRequest req) {
+    Locale locale = req.getLocale();
+
+    return locale.getLanguage();
+  }
 }
index 9e3dc96..97e80b2 100755 (executable)
@@ -79,8 +79,9 @@ public class MirBasicProducerLocalizer implements MirProducerLocalizer {
     aFactoriesMap.put("static", factory);
 
     aFactoriesMap.put("images", new OldProducerAdapterFactory(new ProducerImages()));
-    aFactoriesMap.put("navigationold", new OldProducerAdapterFactory(new ProducerNavigation()));
+/*    aFactoriesMap.put("navigationold", new OldProducerAdapterFactory(new ProducerNavigation()));
     aFactoriesMap.put("openposting", new OldProducerAdapterFactory(new ProducerOpenPosting()));
     aFactoriesMap.put("topics", new OldProducerAdapterFactory(new ProducerTopics()));
+*/
   };
 }
diff --git a/source/mirlocal/euskalherria.indymedia.org/EHLocalizer.java b/source/mirlocal/euskalherria.indymedia.org/EHLocalizer.java
new file mode 100755 (executable)
index 0000000..c8de531
--- /dev/null
@@ -0,0 +1,21 @@
+package mirlocal.euskalherria.indymedia.org;
+
+import mircoders.localizer.*;
+import mircoders.global.*;
+import mircoders.localizer.basic.*;
+
+public class EHLocalizer extends MirBasicLocalizer {
+
+  public MirProducerLocalizer producers() {
+    return new EHProducerLocalizer();
+  }
+
+  public MirOpenPostingLocalizer openPostings() {
+    return new EHOpenPostingLocalizer();
+  }
+
+  public MirProducerToolLocalizer producerTool() {
+    return new MirBasicProducerToolLocalizer();
+  }
+
+}
\ No newline at end of file
diff --git a/source/mirlocal/euskalherria.indymedia.org/EHOpenPostingLocalizer.java b/source/mirlocal/euskalherria.indymedia.org/EHOpenPostingLocalizer.java
new file mode 100755 (executable)
index 0000000..c9724d8
--- /dev/null
@@ -0,0 +1,17 @@
+package mirlocal.euskalherria.indymedia.org;
+
+import mircoders.localizer.*;
+import mircoders.global.*;
+import mircoders.localizer.basic.*;
+
+public class EHOpenPostingLocalizer extends MirBasicOpenPostingLocalizer {
+
+  public void afterContentPosting() {
+    super.afterContentPosting();
+  }
+
+  public void afterCommentPosting() {
+    MirGlobal.producerEngine().addJob("startpage", "all");
+    super.afterCommentPosting();
+  }
+}
diff --git a/source/mirlocal/euskalherria.indymedia.org/EHProducerLocalizer.java b/source/mirlocal/euskalherria.indymedia.org/EHProducerLocalizer.java
new file mode 100755 (executable)
index 0000000..3c7216c
--- /dev/null
@@ -0,0 +1,121 @@
+package mirlocal.euskalherria.indymedia.org;
+
+import java.util.*;
+import mir.producer.*;
+import mircoders.global.*;
+import mircoders.localizer.*;
+import mircoders.localizer.basic.*;
+import mircoders.producer.*;
+import mircoders.storage.*;
+import mircoders.entity.adapter.*;
+
+public class EHProducerLocalizer extends MirBasicProducerLocalizer {
+
+  protected void setupContentFactory(CompositeProducerFactory aContentFactory) {
+    EntityEnumeratingProducerNode contentNode = null;
+
+    try {
+      contentNode =
+          new EntityEnumeratingProducerNode( "content", DatabaseContent.getInstance(), ContentAdapterDefinition.getInstance(),
+            new CompositeProducerNode( new ProducerNode[] {
+              new EntityEnumeratingProducerNode( "language", DatabaseLanguage.getInstance(), LanguageAdapterDefinition.getInstance(), "", "",
+                new ResourceBundleProducerNode("lang", "bundles.producer_${language.code}",
+                    new CompositeProducerNode( new ProducerNode[] {
+                      new GeneratingProducerNode(
+                          "/producer/euskalherria.indymedia.org/article.template",
+                          "${config.storageRoot}/${language.code}/${content.date.formatted.yyyy}/${content.date.formatted.MM}/${content.id}.shtml"
+                      ),
+                      new FileDateSettingProducerNode(
+                          "${config.storageRoot}/${language.code}/${content.date.formatted.yyyy}/${content.date.formatted.MM}/${content.id}.shtml",
+                          "content.date.date"
+                      )
+                    } )
+                )
+              )
+            } )
+          );
+    }
+    catch (Throwable t) {
+    }
+
+    contentNode.addVerb( "all", "is_published='1'", "" );
+    contentNode.addVerb( "all", "is_published='1' and is_produced='f'", "" );
+
+    aContentFactory.addFactory( new NodedProducerFactory( contentNode ) );
+
+  }
+
+  protected void setupStartPageFactory(CompositeProducerFactory aStartPageFactory) {
+    ProducerNode startPageNode = null;
+
+    try {
+      startPageNode =
+            new EntityListProducerNode("newswire", DatabaseContent.getInstance(), ContentAdapterDefinition.getInstance(),
+                    "is_published='1' and to_article_type = 1", "date desc, webdb_create desc", 40,
+              new EntityListProducerNode("languages", DatabaseLanguage.getInstance(), LanguageAdapterDefinition.getInstance(),
+                            "", "code", 10,
+                new EntityEnumeratingProducerNode( "language", DatabaseLanguage.getInstance(), LanguageAdapterDefinition.getInstance(), "", "",
+                  new ResourceBundleProducerNode("lang", "bundles.producer_${language.code}",
+                    new EntityListProducerNode("startspecial", DatabaseContent.getInstance(), ContentAdapterDefinition.getInstance(),
+                              "is_published='1' and to_article_type = 4", "date desc, webdb_create desc", 1,
+                      new EntityListProducerNode("features", DatabaseContent.getInstance(), ContentAdapterDefinition.getInstance(),
+                              "is_published='1' and to_article_type = 2", "date desc, webdb_create desc", 10,
+                        new EntityListProducerNode("breaking", DatabaseBreaking.getInstance(), BreakingAdapterDefinition.getInstance(),
+                                  "", "webdb_create desc", 5,
+                          new GeneratingProducerNode(
+                              "/producer/euskalherria.indymedia.org/startpage.template",
+                              "${config.storageRoot}/${language.code}/index.shtml"
+                          )
+                        )
+                      )
+                    )
+                  )
+                )
+              )
+            );
+    }
+    catch (Throwable t) {
+    }
+
+    aStartPageFactory.addFactory( new NodedProducerFactory( startPageNode ) );
+  }
+
+  protected void setupSynchronizationFactory(CompositeProducerFactory aSynchronizationFactory) {
+    if(MirGlobal.getConfigBooleanProperty("Rsync")){
+      aSynchronizationFactory.addFactory(
+        new ScriptCallProducerFactory(MirGlobal.getConfigProperty("Rsync.Script.Path")));
+    }
+    else {
+      NullProducerFactory nullFactory = new NullProducerFactory();
+      nullFactory.addVerb("run");
+      aSynchronizationFactory.addFactory(nullFactory);
+    }
+  }
+
+  protected void setupStaticFactory(CompositeProducerFactory aStaticFactory) {
+    ProducerNode staticNode = null;
+
+    try {
+      staticNode =
+          new EntityListProducerNode("languages", DatabaseLanguage.getInstance(), LanguageAdapterDefinition.getInstance(),
+                  "", "code", 10,
+            new EntityEnumeratingProducerNode( "language", DatabaseLanguage.getInstance(), LanguageAdapterDefinition.getInstance(), "", "",
+              new ResourceBundleProducerNode("lang", "bundles.producer_${language.code}",
+                new GeneratingProducerNode(
+                    "/producer/euskalherria.indymedia.org/navigation.template",
+                    "${config.storageRoot}/${language.code}/navigation.inc"
+                )
+              )
+            )
+          );
+    }
+    catch (Throwable t) {
+    }
+
+    aStaticFactory.addFactory( new NodedProducerFactory( staticNode ) );
+  }
+
+  protected void setupFactories(Map aFactoriesMap ) {
+    super.setupFactories(aFactoriesMap);
+  }
+}
index 5d25caa..0bc12e3 100755 (executable)
@@ -24,10 +24,16 @@ public class IndyNLProducerLocalizer extends MirBasicProducerLocalizer {
               ),
               new EntityEnumeratingProducerNode( "language", DatabaseLanguage.getInstance(), LanguageAdapterDefinition.getInstance(), "", "",
                 new ResourceBundleProducerNode("lang", "bundles.producer_${language.code}",
-                    new GeneratingProducerNode(
-                        "/producer/indymedia.nl/article.template",
-                        "${config.storageRoot}/${language.code}/${content.date.year}/${content.date.month}/${content.id}.shtml"
-                    )
+                    new CompositeProducerNode( new ProducerNode[] {
+                      new GeneratingProducerNode(
+                          "/producer/indymedia.nl/article.template",
+                          "${config.storageRoot}/${language.code}/${content.date.formatted.yyyy}/${content.date..formatted.MM}/${content.id}.shtml"
+                      ),
+                      new FileDateSettingProducerNode(
+                          "${config.storageRoot}/${language.code}/${content.date.formatted.yyyy}/${content.date..formatted.MM}/${content.id}.shtml",
+                          "content.date.date"
+                      )
+                    } )
                 )
               )
             } )