svn commit: r615141 - in /lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules: ./ GlobalModule.java Module.java ModuleSet.java Modules.java PublicationModule.java
[email protected] Fri, 25 Jan 2008 08:12:09 -0000
Newsgroups
gmane.comp.cms.lenya.cvs
Message-ID
<[email protected] >
Author: solprovider
Date: Fri Jan 25 00:12:07 2008
New Revision: 615141
URL: http://svn.apache.org/viewvc?rev=615141&view=rev
Log:
Can edit XML Resources! (Compare with other Lenya versions: No Areas and no temporary files. Alas, no security beyond deleting the "edit" Module -- if one person can edit, everybody can.)
New code for handling Modules (configuration, variables, resources, inheritance) written but not activated.
The next task is activate new Module code, leading to Publication configuration and Add New Resource functions.
[This was the comment for last commit. Sent wrong comment while fixing Subversion issues with these files.]
Added:
lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/
lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/GlobalModule.java
lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/Module.java
lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/ModuleSet.java
lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/Modules.java
lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/PublicationModule.java
Added: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/GlobalModule.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/GlobalModule.java?rev=615141&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/GlobalModule.java (added)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/GlobalModule.java Fri Jan 25 00:12:07 2008
@@ -0,0 +1,32 @@
+package org.apache.lenya.cms.modules;
+
+import java.io.File;
+import java.util.Iterator;
+
+public class GlobalModule extends Module {
+
+ public GlobalModule(File moduleDirectory) {
+ super(moduleDirectory, "");
+ }
+ /**
+ * Retrieves the absolute path to the first file found following inheritance.
+ * @param filename
+ * @return
+ */
+ public String getFile(String filename){
+ // Check cache
+ if(files.containsKey(filename)) return (String) files.get(filename);
+ // Check this Module.
+ File file = new File(moduleDirectory, filename);
+ if(file.exists()) return file.getAbsolutePath();
+ // Check Module Inheritance
+ Iterator inherit = inheritList.entrySet().iterator();
+ String ret = "";
+ while(inherit.hasNext() && (ret.length() < 1)){
+ ret = Modules.getModule((String)inherit.next(), type).getFile(filename);
+ }
+ if(ret.length() > 0) return ret;
+ // Check Global Module using id.
+ return Modules.getModule(id, type).getFile(filename);
+ }
+}
Added: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/Module.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/Module.java?rev=615141&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/Module.java (added)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/Module.java Fri Jan 25 00:12:07 2008
@@ -0,0 +1,138 @@
+package org.apache.lenya.cms.modules;
+import java.io.File;
+import java.io.IOException;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.TreeMap;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
+import org.xml.sax.SAXException;
+abstract class Module {
+ public static final String TYPE_FLAT = "flat";
+ public static final String TYPE_HIERARCHICAL = "hierarchical";
+ public static final String MODULE_XML = "module.xml";
+ Map inheritList; // String names of other Modules in this publication.
+ Map requiredList; // required Modules: id = reason
+ Map recommendedList; // recommended Modules: id = reason
+ Map optionalList; // optional Modules: id = reason
+ Map variables; // String
+ Map files; // filename -> actual location as String (Better as File or
+ // Source?)
+ File moduleDirectory;
+ String type = TYPE_HIERARCHICAL;
+ String id;
+ String name;
+ String minimum = "1.3";
+ String maximum = "";
+ String created = "1.3";
+ String content = "all";
+ String modified = "1.3";
+ String resource = "";
+ String description = "";
+ String usage = "";
+ public Module(File moduleDirectory, String publicationId) {
+ String pubIdError = (publicationId.length() > 1 ? publicationId + " - " : "");
+ this.moduleDirectory = moduleDirectory;
+ id = moduleDirectory.getName();
+ File configFile = new File(moduleDirectory, MODULE_XML);
+ if(configFile.canRead()){
+ DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
+ Configuration config;
+ try{
+ config = builder.buildFromFile(configFile);
+ id = config.getAttribute("id", id);
+ name = config.getAttribute("name", id);
+ minimum = config.getAttribute("minimum", minimum);
+ maximum = config.getAttribute("maximum", maximum);
+ created = config.getAttribute("created", created);
+ content = config.getAttribute("content", content);
+ modified = config.getAttribute("modified", modified);
+ resource = config.getAttribute("resource", "");
+ // Description
+ Configuration descriptionConf = config.getChild("description");
+ description = descriptionConf.getValue("");
+ // Usage
+ Configuration usageConf = config.getChild("usage");
+ usage = usageConf.getValue("");
+ // Required
+ Configuration[] requireds = config.getChildren("required");
+ requiredList = new TreeMap();
+ int numRequireds = requireds.length;
+ for(int vR = 0; vR < numRequireds; vR++){
+ Configuration required = requireds[vR];
+ // Get attributes
+ String id = required.getAttribute("id", "");
+ String reason = required.getValue("");
+ requiredList.put(id, reason);
+ }
+ // Recommended
+ Configuration[] recommendeds = config.getChildren("recommended");
+ recommendedList = new TreeMap();
+ int numrecommendeds = recommendeds.length;
+ for(int vR = 0; vR < numrecommendeds; vR++){
+ Configuration recommended = recommendeds[vR];
+ // Get attributes
+ String id = recommended.getAttribute("id", "");
+ String reason = recommended.getValue("");
+ recommendedList.put(id, reason);
+ }
+ // Optional
+ Configuration[] optionals = config.getChildren("optional");
+ optionalList = new TreeMap();
+ int numoptionals = optionals.length;
+ for(int vR = 0; vR < numoptionals; vR++){
+ Configuration optional = optionals[vR];
+ // Get attributes
+ String id = optional.getAttribute("id", "");
+ String reason = optional.getValue("");
+ optionalList.put(id, reason);
+ }
+ // Inherits
+ Configuration[] inherits = config.getChildren("inherit");
+ inheritList = new TreeMap();
+ int numInherits = inherits.length;
+ for(int vI = 0; vI < numInherits; vI++){
+ Configuration inherit = inherits[vI];
+ // Get attributes
+ String priority = inherit.getAttribute("priority", "");
+ String publication = inherit.getAttribute("publication", "");
+ String id = inherit.getAttribute("id", "");
+ // Massage
+ // TODO: Cheap shortcuts. Rewrite inheritList storage later.
+ int priorityLength = priority.length();
+ String priorityPrefix = priorityLength > 3 ? priority : "000" + priority.substring(priorityLength);
+ String publicationPrefix = publication.length() > 0 ? publication + "." : "";
+ inheritList.put(priorityPrefix + "." + publicationPrefix + id, publicationPrefix + id);
+ }
+ }catch(ConfigurationException e){
+ System.out.println("Module " + pubIdError + id + " has a ConfigurationException.\n" + e.getLocalizedMessage());
+ }catch(SAXException e){
+ System.out.println("Module " + pubIdError + id + " has a SAXException.\n" + e.getLocalizedMessage());
+ }catch(IOException e){
+ System.out.println("Module " + pubIdError + id + " has an IOException.\n" + e.getLocalizedMessage());
+ }
+ }
+ }
+ public String getType() {
+ return type;
+ }
+ public int getModified() {
+ // TODO: Use date?
+ return 0;
+ }
+ public String getId() {
+ return id;
+ }
+ public Set getRequired() {
+ Set set = new LinkedHashSet();
+ set.addAll(requiredList.keySet());
+ StringTokenizer tokens = new StringTokenizer(resource, "/");
+ while(tokens.hasMoreTokens())
+ set.add(tokens.nextToken());
+ return set;
+ }
+ abstract public String getFile(String filename);
+}
Added: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/ModuleSet.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/ModuleSet.java?rev=615141&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/ModuleSet.java (added)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/ModuleSet.java Fri Jan 25 00:12:07 2008
@@ -0,0 +1,46 @@
+package org.apache.lenya.cms.modules;
+public class ModuleSet {
+ Module flat = null;
+ Module hierarchical = null;
+ public ModuleSet() {
+ }
+ public Module getFlat() {
+ return flat;
+ }
+ public Module getHierarchical() {
+ return hierarchical;
+ }
+ public void add(Module module) {
+ if(Module.TYPE_FLAT.equalsIgnoreCase(module.getType())){
+ if(null == flat){
+ flat = module;
+ }else if(Module.TYPE_FLAT.equalsIgnoreCase(flat.getType())){
+ flat = compareModules(flat, module);
+ }else{
+ flat = module;
+ }
+ }else if(Module.TYPE_HIERARCHICAL.equalsIgnoreCase(module.getType())){
+ if(null == hierarchical){
+ hierarchical = module;
+ }else if(Module.TYPE_HIERARCHICAL.equalsIgnoreCase(hierarchical.getType())){
+ hierarchical = compareModules(hierarchical, module);
+ }else{
+ hierarchical = module;
+ }
+ }else{
+ if(null == flat)
+ flat = module;
+ if(null == hierarchical)
+ hierarchical = module;
+ }
+ }
+ private Module compareModules(Module m1, Module m2) {
+ if(m1 == null)
+ return m2;
+ if(m2 == null)
+ return m1;
+ if(m1.getModified() < m2.getModified())
+ return m2;
+ return m1;
+ }
+}
Added: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/Modules.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/Modules.java?rev=615141&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/Modules.java (added)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/Modules.java Fri Jan 25 00:12:07 2008
@@ -0,0 +1,126 @@
+package org.apache.lenya.cms.modules;
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.cocoon.util.IOUtils;
+/**
+ * Singleton class containing all Modules.
+ *
+ * @author solprovider
+ */
+public class Modules {
+ static Map globalModules;
+ static Map publicationModules;
+ static String servletContextPath;
+ private static volatile boolean isInitialized = false;
+ private Modules() {
+ }
+ static{
+ // System.out.println("Modules: Loading...");
+ // TODO: Need better getServletContextPath()
+ servletContextPath = IOUtils.getFullFilename(new File("build" + File.separator + "lenya" + File.separator + "webapp"));
+ initialize();
+ }
+ private static synchronized void initialize() {
+ globalModules = new HashMap();
+ publicationModules = new HashMap();
+ // Global Modules
+ File globalModulesPath = new File(servletContextPath, "lenya" + File.separator + "modules");
+ File[] moduleDirectories = globalModulesPath.listFiles();
+ if(null != moduleDirectories){
+ int mdLength = moduleDirectories.length;
+ for(int md = 0; md < mdLength; md++){
+ File moduleDirectory = moduleDirectories[md];
+ if(moduleDirectory.isDirectory()){
+ Module newModule = new GlobalModule(moduleDirectory);
+ String id = newModule.getId();
+ if(globalModules.containsKey(id)){
+ Object o = globalModules.get(id);
+ if(Module.class.isAssignableFrom(o.getClass())){
+ Module oldModule = (Module) o;
+ ModuleSet moduleSet = new ModuleSet();
+ moduleSet.add(oldModule);
+ moduleSet.add(newModule);
+ globalModules.put(id, moduleSet);
+ }else if(ModuleSet.class.isAssignableFrom(o.getClass())){
+ ModuleSet moduleSet = (ModuleSet) o;
+ moduleSet.add(newModule);
+ globalModules.put(id, moduleSet);
+ }else{
+ System.out.println("GlobalModules: Found class " + o.getClass().toString());
+ }
+ }else{
+ globalModules.put(id, newModule);
+ }
+ }
+ }
+ } // END Global Modules
+ // Publication Modules
+ File publicationsPath = new File(servletContextPath, "lenya" + File.separator + "pubs");
+ File[] publicationDirectories = publicationsPath.listFiles();
+ int pdLength = publicationDirectories.length;
+ for(int pd = 0; pd < pdLength; pd++){
+ File publicationDirectory = publicationDirectories[pd];
+ if(publicationDirectory.isDirectory()){
+ // Publication
+ String pubid = publicationDirectory.getName();
+ File publicationModulesPath = new File(publicationDirectory, "modules");
+ File[] publicationModuleDirectories = publicationModulesPath.listFiles();
+ if(null != publicationModuleDirectories){
+ int pmdLength = publicationModuleDirectories.length;
+ for(int md = 0; md < pmdLength; md++){
+ File moduleDirectory = publicationModuleDirectories[md];
+ if(moduleDirectory.isDirectory()){
+ Module newModule = new PublicationModule(moduleDirectory, pubid);
+ String id = pubid + "." + newModule.getId();
+ if(publicationModules.containsKey(id)){
+ Object o = publicationModules.get(id);
+ if(Module.class.isAssignableFrom(o.getClass())){
+ Module oldModule = (Module) o;
+ ModuleSet moduleSet = new ModuleSet();
+ moduleSet.add(oldModule);
+ moduleSet.add(newModule);
+ publicationModules.put(id, moduleSet);
+ }else if(ModuleSet.class.isAssignableFrom(o.getClass())){
+ ModuleSet moduleSet = (ModuleSet) o;
+ moduleSet.add(newModule);
+ publicationModules.put(id, moduleSet);
+ }else{
+ System.out.println("PublicationModules: Found class " + o.getClass().toString());
+ }
+ }else{
+ publicationModules.put(id, newModule);
+ }
+ }
+ }
+ } // END Publication
+ }
+ } // END Publication Modules
+ isInitialized = true;
+ }
+ static public Module getModule(String id, String type) {
+ while(!isInitialized)
+ try{
+ Thread.currentThread().wait(1000);
+ }catch(InterruptedException e){
+ e.printStackTrace();
+ }
+ if(publicationModules.containsKey(id))
+ return getModuleByType(publicationModules.get(id), type);
+ if(globalModules.containsKey(id))
+ return getModuleByType(globalModules.get(id), type);
+ return null;
+ }
+ static private Module getModuleByType(Object o, String type) {
+ if(Module.class.isAssignableFrom(o.getClass())){
+ return (Module) o;
+ }else if(ModuleSet.class.isAssignableFrom(o.getClass())){
+ if(Module.TYPE_HIERARCHICAL.equals(type)){
+ return (Module) ((ModuleSet) o).getHierarchical();
+ }else{
+ return (Module) ((ModuleSet) o).getFlat();
+ }
+ }
+ return null;
+ }
+}
Added: lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/PublicationModule.java
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/PublicationModule.java?rev=615141&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/PublicationModule.java (added)
+++ lenya/branches/revolution/1.3.x/src/java/org/apache/lenya/cms/modules/PublicationModule.java Fri Jan 25 00:12:07 2008
@@ -0,0 +1,37 @@
+package org.apache.lenya.cms.modules;
+import java.io.File;
+import java.util.Iterator;
+public class PublicationModule extends Module {
+ String publication;
+ public PublicationModule(File moduleDirectory, String publicationId) {
+ super(moduleDirectory, publicationId);
+ publication = publicationId;
+ }
+ /**
+ * Retrieves the absolute path to the first file found following inheritance.
+ *
+ * @param filename
+ * @return
+ */
+ public String getFile(String filename) {
+ // Check cache
+ if(files.containsKey(filename))
+ return (String) files.get(filename);
+ // Check this Module.
+ File file = new File(moduleDirectory, filename);
+ if(file.exists())
+ return file.getAbsolutePath();
+ // Check Module Inheritance
+ Iterator inherit = inheritList.entrySet().iterator();
+ String ret = "";
+ while(inherit.hasNext() && (ret.length() < 1)){
+ ret = Modules.getModule((String) inherit.next(), type).getFile(filename);
+ }
+ if(ret.length() > 0)
+ return ret;
+ // Check Publication Inheritance
+ // TODO: Check Publication's inheritance.
+ // Check Global Module using id.
+ return Modules.getModule(id, type).getFile(filename);
+ }
+}