return entity.hashCode();
}
- protected Entity getEntity() {
+ public Entity getEntity() {
return entity;
}
import java.util.*;
import mir.entity.*;
import mir.storage.*;
+import mir.util.*;
public class EntityAdapterDefinition {
Map calculatedFields;
}
public Object getValue(EntityAdapter anEntityAdapter) {
+
Map result = new HashMap();
String textValue = anEntityAdapter.getEntity().getValue(fieldName);
Calendar calendar = GregorianCalendar.getInstance();
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) {
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)
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));
+ }
+ }
+*/
}
--- /dev/null
+/*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
}
private class EntityEnumeratingProducerNodeVerb {
- StorageObject database;
-
String whereClause;
String orderByClause;
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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();
+ }
+}
--- /dev/null
+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
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();
}
}
- 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 {
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 {
return result.toString();
}
+
public static class ParameterExpanderExc extends Exc {
public ParameterExpanderExc(String msg, Object[] objects) {
super(msg, objects);
package mircoders.localizer;
+import java.util.*;
+import javax.servlet.http.*;
+
public interface MirOpenPostingLocalizer {
public void afterContentPosting();
public void afterCommentPosting();
+
+ public String chooseOpenPostingLanguage(HttpServletRequest req);
}
package mircoders.localizer.basic;
+import java.util.*;
+import javax.servlet.http.*;
+
import mircoders.localizer.*;
import mircoders.global.*;
MirGlobal.producerEngine().addJob("content", "new");
MirGlobal.producerEngine().addJob("synchronization", "run");
}
+
+ public String chooseOpenPostingLanguage(HttpServletRequest req) {
+ Locale locale = req.getLocale();
+
+ return locale.getLanguage();
+ }
}
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()));
+*/
};
}
--- /dev/null
+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
--- /dev/null
+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();
+ }
+}
--- /dev/null
+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);
+ }
+}
),
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"
+ )
+ } )
)
)
} )