1 10 11 package org.mmbase.applications.packaging; 12 13 import java.io.DataOutputStream ; 14 import java.io.File ; 15 import java.io.FileOutputStream ; 16 import java.util.*; 17 18 19 import org.mmbase.applications.packaging.projects.Project; 20 import org.mmbase.applications.packaging.projects.creators.CreatorInterface; 21 import org.mmbase.applications.packaging.util.ExtendedDocumentReader; 22 import org.mmbase.util.XMLEntityResolver; 23 import org.mmbase.util.logging.Logger; 24 import org.mmbase.util.logging.Logging; 25 import org.w3c.dom.Element ; 26 import org.w3c.dom.NamedNodeMap ; 27 28 36 public class ProjectManager { 37 38 private static final Logger log = Logging.getLoggerInstance(ProjectManager.class); 40 41 private static boolean state = false; 43 44 private static Map projects = new HashMap(); 46 47 private static Map creators = new HashMap(); 49 50 public static final String DTD_PROJECTS_1_0 = "projects_1_0.dtd"; 52 public static final String DTD_CREATORS_1_0 = "creators_1_0.dtd"; 53 54 public static final String PUBLIC_ID_PROJECTS_1_0 = "-//MMBase//DTD projects config 1.0//EN"; 55 public static final String PUBLIC_ID_CREATORS_1_0 = "-//MMBase//DTD creators config 1.0//EN"; 56 57 static { 58 XMLEntityResolver.registerPublicID(PUBLIC_ID_PROJECTS_1_0, "DTD_PROJECTS_1_0", ProjectManager.class); 59 XMLEntityResolver.registerPublicID(PUBLIC_ID_CREATORS_1_0, "DTD_CREATORS_1_0", ProjectManager.class); 60 } 61 62 63 64 67 public static synchronized void init() { 68 if (!isRunning()) { 69 readCreators(); 70 readProjects(); 71 state=true; 72 } 73 } 74 75 81 public static boolean isRunning() { 82 return state; 83 } 84 85 86 87 92 public static Iterator getProjects() { 93 return projects.values().iterator(); 94 } 95 96 97 102 public static Project getProject(String name) { 103 return (Project)projects.get(name); 104 } 105 106 107 113 public static boolean addProject(String name,String path) { 114 Project pr = new Project(name,path); 115 if (pr.save()) { 116 projects.put(name,pr); 117 save(); 118 } 119 return true; 120 } 121 122 123 129 public static boolean changeProjectSettings(String oldname,String newname,String newpath) { 130 Project p = (Project)projects.get(oldname); 131 if (p != null) { 132 projects.remove(oldname); 133 addProject(newname,newpath); 134 save(); 135 } 136 return true; 137 } 138 139 145 public static boolean deleteProject(String name) { 146 projects.remove(name); 147 save(); 148 return true; 149 } 150 151 156 public static void readProjects() { 157 158 160 String filename = PackageManager.getConfigPath()+File.separator+"packaging"+File.separator+"projects.xml"; 161 File file = new File (filename); 162 if(file.exists()) { 163 ExtendedDocumentReader reader = new ExtendedDocumentReader(filename,ProjectManager.class); 164 if(reader!=null) { 165 166 for(Iterator ns=reader.getChildElements("projects","project");ns.hasNext(); ) { 168 Element n=(Element )ns.next(); 169 NamedNodeMap nm=n.getAttributes(); 170 if (nm!=null) { 171 String name=null; 172 String path=null; 173 174 org.w3c.dom.Node n3=nm.getNamedItem("name"); 176 if (n3!=null) { 177 name=n3.getNodeValue(); 178 } 179 180 n3=nm.getNamedItem("path"); 182 if (n3!=null) { 183 path=n3.getNodeValue(); 184 } 185 186 if (path!=null && name!=null) { 187 Project p=new Project(name,path); 188 projects.put(name,p); 189 } 190 } 191 } 192 } 193 } else { 194 log.error("missing projects file : "+filename); 195 } 196 } 197 198 199 204 public static void readCreators() { 205 creators = new HashMap(); 206 207 209 String filename = PackageManager.getConfigPath() + File.separator + "packaging" + File.separator + "creators.xml"; 210 211 File file = new File (filename); 212 if(file.exists()) { 213 ExtendedDocumentReader reader = new ExtendedDocumentReader(filename, ProjectManager.class); 214 if(reader != null) { 215 for(Iterator ns = reader.getChildElements("creators","creator");ns.hasNext(); ) { 216 Element n = (Element )ns.next(); 217 NamedNodeMap nm = n.getAttributes(); 218 if (nm != null) { 219 String type = null; 220 String classname = null; 221 222 org.w3c.dom.Node n2 = nm.getNamedItem("type"); 224 if (n2 != null) { 225 type = n2.getNodeValue(); 226 } 227 228 n2 = nm.getNamedItem("class"); 230 if (n2 != null) { 231 classname = n2.getNodeValue(); 232 } 233 try { 234 Class newclass = Class.forName(classname); 235 CreatorInterface cr = (CreatorInterface)newclass.newInstance(); 236 cr.setType(type); 237 if (cr !=null) creators.put(type,cr); 238 } catch (Exception e) { 239 log.error("Can't create creator : "+classname+" for type "+type); 240 e.printStackTrace(); 241 } 242 } 243 } 244 } 245 } else { 246 log.error("missing creator file : "+filename); 247 } 248 } 249 250 255 public static Map getCreators() { 256 return creators; 257 } 258 259 264 public static CreatorInterface getCreatorByType(String type) { 265 Object o = creators.get(type); 266 if (o != null) return (CreatorInterface)o; 267 return null; 268 } 269 270 271 276 public static boolean save() { 277 String body = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; 278 body += "<!DOCTYPE projects PUBLIC \"-//MMBase/DTD projects config 1.0//EN\" \"http://www.mmbase.org/dtd/projects_1_0.dtd\">\n"; 279 body += "<projects>\n"; 280 Iterator e=projects.values().iterator(); 281 while (e.hasNext()) { 282 Project pr = (Project)e.next(); 283 body += "\t<project name=\""+pr.getName()+"\" path=\""+pr.getPath()+"\" />\n"; 284 } 285 body += "</projects>\n"; 286 String filename = PackageManager.getConfigPath()+File.separator+"packaging"+File.separator+"projects.xml"; 287 File sfile = new File (filename); 288 try { 289 DataOutputStream scan = new DataOutputStream (new FileOutputStream (sfile)); 290 scan.writeBytes(body); 291 scan.flush(); 292 scan.close(); 293 } catch(Exception f) { 294 log.error(Logging.stackTrace(f)); 295 } 296 return true; 297 } 298 } 299 | Popular Tags |