1 10 package org.mmbase.module.core; 11 12 import java.io.File ; 13 import java.util.*; 14 import java.text.DateFormat ; 15 16 import org.mmbase.core.event.*; 17 import org.mmbase.datatypes.DataTypes; 18 import org.mmbase.module.ProcessorModule; 19 import org.mmbase.module.SendMailInterface; 20 import org.mmbase.module.builders.DayMarkers; 21 import org.mmbase.module.builders.Versions; 22 import org.mmbase.module.corebuilders.*; 23 import org.mmbase.security.MMBaseCop; 24 import org.mmbase.storage.*; 25 import org.mmbase.storage.search.RelationStep; 26 import org.mmbase.model.*; 27 import org.mmbase.storage.search.SearchQueryHandler; 28 import org.mmbase.util.ResourceLoader; 29 import org.mmbase.util.logging.Logger; 30 import org.mmbase.util.logging.Logging; 31 import org.mmbase.util.platform.setUser; 32 import org.mmbase.util.xml.BuilderReader; 33 import org.mmbase.util.xml.BuilderWriter; 34 import org.mmbase.util.functions.*; 35 import org.xml.sax.SAXException ; 36 37 import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap; 38 39 51 public class MMBase extends ProcessorModule { 52 53 54 58 private static final int STATE_SHUT_DOWN = -3; 59 60 64 private static final int STATE_START_UP = -2; 65 66 70 private static final int STATE_STARTED_INIT = -1; 71 75 private static final int STATE_LOAD = 0; 76 80 private static final int STATE_INITIALIZE = 1; 81 85 private static final int STATE_UP = 2; 86 87 private static final Logger log = Logging.getLoggerInstance(MMBase.class); 89 90 91 94 private static MMBase mmbaseroot = null; 95 96 100 public static final int startTime = (int) (System.currentTimeMillis() / 1000); 101 102 105 private static ResourceLoader builderLoader = ResourceLoader.getConfigurationRoot().getChildResourceLoader("builders"); 106 107 114 public String baseName = "def1"; 115 116 119 private TypeDef typeDef; 120 123 private RelDef relDef; 124 127 private OAlias oAlias; 128 131 private InsRel insRel; 132 135 private TypeRel typeRel; 136 137 141 private Map mmobjs = new ConcurrentHashMap(); 142 143 private CloudModel cloudModel; 144 145 150 private boolean inDevelopment = false; 151 152 158 private String machineName = "unknown"; 159 160 165 private String host = "unknown"; 166 167 170 private String authtype = "none"; 171 172 175 private StorageManagerFactory storageManagerFactory = null; 176 177 181 private MMObjectBuilder rootBuilder; 182 183 187 private String dtdbase = "http://www.mmbase.org"; 188 189 192 private MMBaseCop mmbaseCop = null; 193 194 199 private ClusterBuilder clusterBuilder; 200 201 204 private Locale locale = Locale.ENGLISH; 205 206 private TimeZone timeZone = TimeZone.getDefault(); 207 208 216 private String encoding = "ISO-8859-1"; 217 218 223 private int mmbaseState = STATE_START_UP; 224 225 233 private Set loading = new HashSet(); 234 235 236 239 public MMBase() { 240 if (mmbaseroot != null) log.error("Tried to instantiate a second MMBase"); 241 log.debug("MMBase constructed"); 242 } 243 244 248 public synchronized void init() { 249 if (mmbaseState >= STATE_STARTED_INIT) { 250 log.debug("Already initing"); 251 return; 252 } 253 log.service("Init of " + org.mmbase.Version.get() + " (" + this + ")"); 254 255 mmbaseState = STATE_STARTED_INIT; 256 257 mmbaseroot = this; 261 262 loadInitParameters("mmbase/mmbaseroot"); 263 264 String tmp = getInitParameter("BASENAME"); 266 if (tmp != null) { 267 baseName = tmp; 269 } else { 270 log.info("init(): No name defined for mmbase using default (def1)"); 271 } 272 273 tmp = getInitParameter("AUTHTYPE"); 274 if (tmp != null && !tmp.equals("")) { 275 authtype = tmp; 276 } 277 278 tmp = getInitParameter("TIMEZONE"); 279 if (tmp != null && !tmp.equals("")) { 280 timeZone = TimeZone.getTimeZone(tmp); 281 } 282 DateFormat format = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.US); 283 format.setTimeZone(timeZone); 284 log.info("MMBase Time zone : " + timeZone.getDisplayName(Locale.US) + " (it's now " + format.format(new Date()) + ")"); 285 org.mmbase.util.dateparser.DateParser.setDefault(timeZone); 286 287 tmp = getInitParameter("LANGUAGE"); 288 if (tmp != null && !tmp.equals("")) { 289 locale = new Locale(tmp, ""); 290 } 291 log.info("MMBase default locale : " + locale); 292 org.mmbase.util.LocalizedString.setDefault(locale); 293 294 tmp = getInitParameter("DEVELOPMENT"); 295 if (tmp != null && !tmp.equals("")) { 296 inDevelopment = "true".equals(tmp); 297 } 298 299 tmp = getInitParameter("ENCODING"); 300 if (tmp != null && !tmp.equals("")) { 301 encoding = tmp; 302 } 303 304 tmp = getInitParameter("DTDBASE"); 305 if (tmp != null && !tmp.equals("")) { 306 dtdbase = tmp; 307 } 308 309 DataTypes.initialize(); 311 312 try { 315 host = java.net.InetAddress.getLocalHost().getHostName(); 316 machineName = host + MMBaseContext.getHtmlRootUrlPath(); 317 } catch (java.net.UnknownHostException uhe) { 318 machineName = "UNKNOWN"; 319 host = machineName; 320 } 321 322 tmp = getInitParameter("HOST"); 323 if (tmp != null && !tmp.equals("")) { 324 host = tmp; 325 } 326 327 String machineNameParam = getInitParameter("MACHINENAME"); 328 if (machineNameParam != null) { 329 int pos = machineNameParam.indexOf("${HOST}"); 331 if (pos != -1) { 332 machineNameParam = 333 machineNameParam.substring(0, pos) + 334 machineName + machineNameParam.substring(pos + 7); 335 } 336 pos = machineNameParam.indexOf("${USER}"); 338 if (pos != -1) { 339 machineNameParam = machineNameParam.substring(0, pos) + System.getProperty("user.name") + machineNameParam.substring(pos + 7); 340 } 341 machineName = machineNameParam; 342 } 343 log.service("MMBase machine name used for clustering: '" + machineName + "'"); 344 Logging.setMachineName(machineName); 345 346 log.service("Initializing storage"); 347 initializeStorage(); 348 349 mmbaseState = STATE_LOAD; 350 351 352 log.debug("Loading builders:"); 353 354 cloudModel = ModelsManager.addModel("default","default.xml"); 355 356 loadBuilders(); 357 358 if(Thread.currentThread().isInterrupted()) { 359 log.info("Interrupted"); 360 return; 361 } 362 363 mmbaseState = STATE_INITIALIZE; 364 365 366 log.debug("Checking MMBase"); 367 if (!checkMMBase()) { 368 createMMBase(); 370 } 371 372 log.service("Initializing builders:"); 373 initBuilders(); 374 375 EventManager.getInstance().addEventListener(org.mmbase.cache.NodeCache.getCache()); 376 377 log.debug("Objects started"); 378 379 String writerpath = getInitParameter("XMLBUILDERWRITERDIR"); 380 if (writerpath != null && !writerpath.equals("")) { 381 Iterator t = mmobjs.values().iterator(); 382 while (t.hasNext()) { 383 MMObjectBuilder builder = (MMObjectBuilder)t.next(); 384 if (!builder.isVirtual()) { 385 String name = builder.getTableName(); 386 log.debug("WRITING BUILDER FILE =" + writerpath + File.separator + name); 387 try { 388 BuilderWriter builderOut = new BuilderWriter(builder); 389 builderOut.setIncludeComments(false); 390 builderOut.setExpandBuilder(false); 391 builderOut.writeToFile(writerpath + File.separator + builder.getTableName() + ".xml"); 392 } catch (Exception ex) { 393 log.error(Logging.stackTrace(ex)); 394 } 395 } 396 } 397 } 398 if(Thread.currentThread().isInterrupted()) { 399 log.info("Interrupted"); 400 return; 401 } 402 403 try { 405 mmbaseCop = new MMBaseCop(); 406 } catch (Exception e) { 407 log.fatal("Error loading the mmbase cop: " + e.getMessage()); 408 log.error(Logging.stackTrace(e)); 409 log.error("MMBase will continue without security."); 410 log.error("All future security invocations will fail."); 411 } 412 413 typeRel.readCache(); 414 415 mmbaseState = STATE_UP; 417 log.info("MMBase is up and running"); 418 checkUserLevel(); 419 420 } 421 422 protected void shutdown() { 424 mmbaseState = STATE_SHUT_DOWN; 425 426 typeDef = null; 429 relDef = null; 430 oAlias = null; 431 insRel = null; 432 typeRel = null; 433 mmobjs.clear(); mmobjs = null; 434 cloudModel = null; 435 storageManagerFactory = null; 436 rootBuilder = null; 437 mmbaseCop = null; 438 clusterBuilder = null; 439 mmbaseroot = null; 440 } 441 442 445 public boolean isShutdown() { 446 return mmbaseState == STATE_SHUT_DOWN; 447 } 448 449 459 public boolean inDevelopment() { 460 return inDevelopment; 461 } 462 463 469 boolean checkMMBase() { 470 return getStorageManager().exists(); 471 } 472 473 485 boolean createMMBase() { 486 log.debug(" creating new multimedia base : " + baseName); 487 getStorageManager().create(); 488 return true; 489 } 490 491 498 private boolean builderLoading(String name) { 499 return loading.contains(name); 500 } 501 502 516 public MMObjectBuilder getBuilder(String name) throws CircularReferenceException { 517 MMObjectBuilder builder = getMMObject(name); 518 if (builder == null && (mmbaseState == STATE_LOAD)) { 519 if (builderLoading(name)) { 521 throw new CircularReferenceException("Circular reference to builder with name '" + name + "': currently loading " + loading); 522 } 523 builder = loadBuilder(name); 524 } 525 return builder; 526 } 527 528 public String getBuilderNameForNode(final int number) { 529 int nodeType = getMMBase().getStorageManager().getNodeType(number); 530 if (nodeType < 0) { 531 throw new StorageNotFoundException("Cannot determine node type of node with number =" + number); 533 } 534 return getTypeDef().getValue(nodeType); 536 } 537 538 public MMObjectBuilder getBuilderForNode(final int number) { 539 String builderName = getBuilderNameForNode(number); 540 MMObjectBuilder nodeBuilder = null; 541 if (builderName == null) { 542 log.error("The nodetype name of node #" + number + " could not be found '"); 543 } 544 else { 545 nodeBuilder = getBuilder(builderName); 546 if (nodeBuilder == null) { 547 log.warn("Node #" + number + "'s builder " + builderName + " is not loaded, taking 'object'."); 548 nodeBuilder = getBuilder("object"); 549 } 550 } 551 return nodeBuilder; 552 } 553 554 557 public MMObjectBuilder addBuilder(String name, MMObjectBuilder bul) { 558 return (MMObjectBuilder) mmobjs.put(name, bul); 559 } 560 561 567 public MMObjectBuilder getMMObject(String name) { 568 if (name == null) throw new RuntimeException ("Cannot get builder with name 'NULL' in " + machineName); 569 Object o = mmobjs.get(name); 570 if (o == null) { 571 log.trace("MMObject " + name + " could not be found"); } 573 return (MMObjectBuilder) o; 574 } 575 576 580 public static MMBase getMMBase() { 581 if (mmbaseroot == null) { 582 synchronized(builderLoader) { mmbaseroot = (MMBase) getModule("mmbaseroot"); 584 if (mmbaseroot == null) { 585 log.fatal("The mmbaseroot module could not be found. Perhaps 'mmbaseroot.xml' is missing?"); 586 } 587 mmbaseroot.startModule(); 588 } 589 } 590 return mmbaseroot; 591 } 592 593 597 public MMBaseCop getMMBaseCop() { 598 return mmbaseCop; 599 } 600 601 606 public Enumeration getMMObjects() { 607 return Collections.enumeration(mmobjs.values()); 608 } 609 610 613 public Collection getBuilders() { 614 return mmobjs.values(); 615 } 616 617 621 public InsRel getInsRel() { 622 return insRel; 623 } 624 625 629 public RelDef getRelDef() { 630 return relDef; 631 } 632 633 637 public TypeDef getTypeDef() { 638 return typeDef; 639 } 640 641 645 public TypeRel getTypeRel() { 646 return typeRel; 647 } 648 649 653 public OAlias getOAlias() { 654 return oAlias; 655 } 656 657 663 public MMObjectBuilder getRootBuilder() { 664 if (rootBuilder == null) { 665 rootBuilder = loadBuilder("object"); 666 } 667 return rootBuilder; 668 } 669 670 675 public int getRootType() { 676 if (rootBuilder == null) { 677 return -1; 678 } else { 679 return rootBuilder.getNumber(); 680 } 681 } 682 683 690 public ClusterBuilder getClusterBuilder() { 691 assertUp(); 692 return clusterBuilder; 693 } 694 695 699 protected void assertUp() { 700 if (! getState()) { 701 synchronized(this) { 702 } 704 } 705 } 706 707 711 public String getBaseName() { 712 return baseName; 713 } 714 715 718 public void maintainance() { 719 DayMarkers dayMarkers = (DayMarkers)getMMObject("daymarks"); 720 if (dayMarkers != null) { 721 dayMarkers.probe(); 722 } else { 723 log.error("Can't access builder : daymarks"); 724 } 725 } 726 727 734 public Hashtable getSearchHash(Vector se, String mapper) { 735 Hashtable results = new Hashtable(); 736 Enumeration t = se.elements(); 737 MMObjectNode node; 738 while (t.hasMoreElements()) { 739 node = (MMObjectNode)t.nextElement(); 740 results.put(new Integer (node.getIntValue(mapper)), node); 741 } 742 return results; 743 } 744 745 752 public String getWhereList(Vector se, String mapper) { 753 if (se == null) 754 return null; 755 StringBuffer inlist = new StringBuffer (); 756 inlist.append(" ("); 757 Enumeration t = se.elements(); 758 MMObjectNode node; 759 while (t.hasMoreElements()) { 760 node = (MMObjectNode)t.nextElement(); 761 inlist.append(node.getIntValue(mapper) + ","); 762 } 763 if (inlist.length() >= 1) 764 inlist.setLength(inlist.length() - 1); 765 inlist.append(") "); 766 return inlist.toString(); 767 } 768 769 776 public SendMailInterface getSendMail() { 777 return (SendMailInterface)getModule("sendmail"); 778 } 779 780 785 public String getMachineName() { 786 return machineName; 787 } 788 789 794 public String getHost() { 795 return host; 796 } 797 798 803 public boolean addRemoteObserver(String type, MMBaseObserver obs) { 804 MMObjectBuilder builder = getMMObject(type); 805 if (builder != null) { 806 return builder.addRemoteObserver(obs); 807 } else { 808 log.error("addRemoteObserver(): ERROR: Can't find builder : " + type); 809 return false; 810 } 811 } 812 813 818 public boolean addLocalObserver(String type, MMBaseObserver obs) { 819 MMObjectBuilder builder = getMMObject(type); 820 if (builder != null) { 821 return builder.addLocalObserver(obs); 822 } else { 823 log.error("addLocalObserver(): ERROR: Can't find builder : " + type); 824 return false; 825 } 826 } 827 828 832 public String doGetAgeMarker(StringTokenizer tok) { 833 if (tok.hasMoreTokens()) { 834 String age = tok.nextToken(); 835 try { 836 int agenr = Integer.parseInt(age); 837 int agecount = ((DayMarkers)getMMObject("daymarks")).getDayCountAge(agenr); 838 return "" + agecount; 839 } catch (Exception e) { 840 log.debug(" Not a valid AGE"); 841 return "No valid age given"; 842 } 843 } else { 844 return "No age given"; 845 } 846 } 847 848 855 public synchronized int getDBKey() { 856 return getStorageManager().createKey(); 857 } 858 859 867 private MMObjectBuilder loadCoreBuilder(String name) { 868 MMObjectBuilder builder = loadBuilder(name); 869 if (builder == null) { 870 throw new BuilderConfigurationException("The core builder " + name + " is mandatory but inactive."); 871 } else { 872 log.debug("Loaded core builder " + builder + " with otype " + builder.getNumber()); 873 return builder; 874 } 875 } 876 877 878 881 private void loadBuilders() { 882 886 getRootBuilder(); 888 typeDef = (TypeDef) loadCoreBuilder("typedef"); 889 relDef = (RelDef) loadCoreBuilder("reldef"); 890 insRel = (InsRel) loadCoreBuilder("insrel"); 891 typeRel = (TypeRel) loadCoreBuilder("typerel"); 892 893 894 try { 895 oAlias = (OAlias)loadBuilder("oalias"); 896 } catch (BuilderConfigurationException e) { 897 } 900 901 902 Set builders = getBuilderLoader().getResourcePaths(ResourceLoader.XML_PATTERN, true); 903 904 log.info("Loading builders: " + builders); 905 Iterator i = builders.iterator(); 906 while (i.hasNext()) { 907 if (Thread.currentThread().isInterrupted()) { 908 return; 909 } 910 String builderXml = (String ) i.next(); 911 String resourceName = ResourceLoader.getName(builderXml); 912 String resourceDirectory = ResourceLoader.getDirectory(builderXml) + "/"; 913 loadBuilderFromXML(resourceName, resourceDirectory); 914 if (cloudModel != null) { 915 cloudModel.addBuilder(resourceName,"builders/" + resourceDirectory + resourceName + ".xml"); 916 } 917 } 918 919 log.debug("Starting Cluster Builder"); 920 clusterBuilder = new ClusterBuilder(this); 921 } 922 923 941 945 boolean initBuilders() { 946 947 typeDef.init(); 948 949 log.debug("Versions:"); 951 Versions versions = (Versions)getMMObject("versions"); 952 if (versions != null) { 953 versions.init(); 954 } 955 956 relDef.init(); 957 insRel.init(); 958 typeRel.init(); 959 960 961 log.debug("mmobjects, inits"); 962 Iterator bi = mmobjs.entrySet().iterator(); 963 while (bi.hasNext()) { 964 Map.Entry me = (Map.Entry)bi.next(); 965 MMObjectBuilder builder = (MMObjectBuilder)me.getValue(); 966 log.debug("init " + builder); 967 try { 968 initBuilder(builder); 969 } catch (BuilderConfigurationException e) { 970 log.error("Removed builder " + builder.getTableName() + " from the builderlist, as it cannot be initialized."); 972 bi.remove(); 973 } catch (Exception ex) { 974 log.error("Something went wrong while initializing builder " + builder.getTableName()); 975 log.info("This builder will be removed from active builder list"); 976 log.error(Logging.stackTrace(ex)); 977 bi.remove(); 978 } 979 } 980 981 log.debug("**** end of initBuilders"); 982 return true; 983 } 984 985 989 public void initBuilder(MMObjectBuilder builder) { 990 if (!builder.isVirtual()) { 991 builder.init(); 992 typeDef.loadTypeDef(builder.getTableName()); 993 Versions versions = (Versions)getMMObject("versions"); 994 if (versions != null && versions.created()) { 995 checkBuilderVersion(builder.getTableName(), versions); 996 } 997 } 998 } 999 1000 1004 public void unloadBuilder(MMObjectBuilder builder) { 1005 if (mmobjs.remove(builder.getTableName()) == null) { 1006 throw new RuntimeException ("builder with name: " + builder.getTableName() + " could not be unloaded, since it was not loaded."); 1007 } 1008 if (!builder.isVirtual()) { 1009 typeDef.unloadTypeDef(builder.getTableName()); 1010 log.info("unloaded builder with name:" + builder.getTableName()); 1011 } else { 1012 log.info("unloaded virtual builder with name:" + builder.getTableName()); 1013 } 1014 } 1015 1016 1017 1020 public ResourceLoader getBuilderLoader() { 1021 return MMBase.builderLoader; 1022 } 1023 1024 1027 public BuilderReader getBuilderReader(String builderName) { 1028 try { 1029 java.net.URL url = getBuilderLoader().getResource(builderName + ".xml"); 1030 if (url == null) return null; 1031 org.w3c.dom.Document doc = ResourceLoader.getDocument(url, true, BuilderReader.class); 1032 BuilderReader r = new BuilderReader(doc, this); 1033 r.setSystemId(url.toString()); 1034 return r; 1035 } catch (SAXException se) { 1036 log.error(se); 1037 return null; 1038 } catch (java.io.IOException ioe) { 1039 log.error(ioe); 1040 return null; 1041 } 1042 } 1043 1044 1053 synchronized MMObjectBuilder loadBuilder(String builderName) { return loadBuilder(builderName, ""); 1055 } 1056 1057 1067 public String getBuilderPath(String builderName, String path) { 1068 Set builders = getBuilderLoader().getResourcePaths(java.util.regex.Pattern.compile(path + ResourceLoader.XML_PATTERN.pattern()), true ); 1069 Iterator i = builders.iterator(); 1070 if (log.isDebugEnabled()) { 1071 log.debug("Found builder " + builders + " from " + getBuilderLoader() + " searching for " + builderName); 1072 } 1073 String xml = builderName + ".xml"; 1074 while (i.hasNext()) { 1075 String builderXml = (String ) i.next(); 1076 if (builderXml.equals(xml)) { 1077 return ""; 1078 } else if (builderXml.endsWith("/" + xml)) { 1079 return builderXml.substring(0, builderXml.length() - xml.length()); 1080 } 1081 } 1082 return null; 1083 } 1084 1085 1086 1087 1095 MMObjectBuilder loadBuilder(String builderName, String ipath) { 1096 MMObjectBuilder builder = getMMObject(builderName); 1097 if (builder != null) { 1098 log.debug("Builder '" + builderName + "' is already loaded"); 1099 return builder; 1100 } 1101 String path = getBuilderPath(builderName, ipath); 1102 if (path != null) { 1103 if (cloudModel != null) { 1104 cloudModel.addBuilder(builderName,path+builderName+".xml"); 1105 } 1106 return loadBuilderFromXML(builderName, path); 1107 } else { 1108 log.error("Cannot find specified builder " + builderName); 1109 throw new BuilderConfigurationException("Cannot find specified builder " + builderName); 1110 } 1111 } 1112 1113 1124 public MMObjectBuilder loadBuilderFromXML(String builderName, String ipath) { 1125 MMObjectBuilder builder = getMMObject(builderName); 1126 if (builder != null) { 1127 log.debug("Builder '" + builderName + "' is already loaded"); 1128 return builder; 1129 } 1130 1131 try { 1132 loading.add(builderName); 1134 BuilderReader parser = getBuilderReader(ipath + builderName); 1135 if (parser == null) return null; 1136 String status = parser.getStatus(); 1137 if (status.equals("active")) { 1138 log.service("Starting builder: " + builderName); 1139 Class newclass; 1140 try { 1141 String classname = parser.getClassName(); 1142 newclass = Class.forName(classname); 1143 } catch (ClassNotFoundException cnfe) { 1144 MMObjectBuilder p = parser.getParentBuilder(); 1145 if(p != null) { 1146 newclass = p.getClass(); 1147 } else { 1148 newclass = MMObjectBuilder.class; 1149 } 1150 log.error(cnfe.toString() + " (for " + parser.getClassName() + ") Falling back to " + newclass.getName()); 1151 } 1152 builder = (MMObjectBuilder)newclass.newInstance(); 1153 1154 addBuilder(builderName, builder); 1155 1156 builder.setXMLPath(ipath); 1157 builder.setMMBase(this); 1158 builder.setTableName(builderName); 1159 1160 MMObjectBuilder parent = parser.getParentBuilder(); 1162 if (parent != null) { 1163 builder.setParentBuilder(parent); 1164 } else if ((builder instanceof InsRel) && !builderName.equals("insrel")) { 1165 builder.setParentBuilder(getInsRel()); 1166 } else if (!builderName.equals("object")) { 1167 builder.setParentBuilder(getRootBuilder()); 1168 } 1169 1170 Hashtable descriptions = parser.getDescriptions(); 1171 builder.setDescriptions(descriptions); 1172 String desc = (String )descriptions.get(locale.getLanguage()); 1173 builder.setDescription(desc); 1175 builder.setSingularNames(parser.getSingularNames()); 1176 builder.setPluralNames(parser.getPluralNames()); 1177 builder.setVersion(parser.getVersion()); 1178 builder.setMaintainer(parser.getMaintainer()); 1179 builder.setSearchAge("" + parser.getSearchAge()); 1180 builder.setInitParameters(parser.getProperties()); 1181 parser.getDataTypes(builder.getDataTypeCollector()); 1182 builder.setFields(parser.getFields(builder, builder.getDataTypeCollector())); 1183 builder.getStorageConnector().addIndices(parser.getIndices(builder)); 1184 Iterator f = parser.getFunctions().iterator(); 1185 while (f.hasNext()) { 1186 Function func = (Function) f.next(); 1187 builder.addFunction(func); 1188 log.service("Added " + func + " to " + builder); 1189 } 1190 if (parent != null) { 1191 Iterator i = parent.getFunctions().iterator(); 1192 while (i.hasNext()) { 1193 Function parentFunction = (Function) i.next(); 1194 if (builder.getFunction(parentFunction.getName()) == null) { 1195 builder.addFunction(parentFunction); 1196 } 1197 } 1198 } 1199 } 1200 } catch (Throwable e) { loading.remove(builderName); 1202 log.error(Logging.stackTrace(e)); 1203 return null; 1204 } 1205 loading.remove(builderName); 1206 return builder; 1207 } 1208 1209 1217 public String getDTDBase() { 1218 return dtdbase; 1219 } 1220 1221 1225 protected void initializeStorage() { 1226 if (storageManagerFactory != null) return; try { 1228 storageManagerFactory = StorageManagerFactory.newInstance(this); 1229 log.info("Using class: '" + storageManagerFactory.getClass().getName() + "'."); 1231 } catch (StorageException se) { 1232 log.error(se.getMessage()); 1233 throw new StorageError(); 1234 } 1235 } 1236 1237 1242 public StorageManagerFactory getStorageManagerFactory() { 1243 return storageManagerFactory; 1244 } 1245 1246 1252 public StorageManager getStorageManager() throws StorageException { 1253 if (storageManagerFactory == null) { 1254 throw new StorageConfigurationException("Storage manager factory not configured."); 1255 } else { 1256 return storageManagerFactory.getStorageManager(); 1257 } 1258 } 1259 1260 1266 public SearchQueryHandler getSearchQueryHandler() throws StorageException { 1267 if (storageManagerFactory == null) { 1268 throw new StorageConfigurationException("Storage manager factory not configured."); 1269 } else { 1270 return storageManagerFactory.getSearchQueryHandler(); 1271 } 1272 } 1273 1274 1280 public MMObjectNode castNode(MMObjectNode node) { 1281 1283 int otype = node.getOType(); 1284 String ename = typeDef.getValue(otype); 1285 if (ename == null) { 1286 return null; 1287 } 1288 MMObjectBuilder res = getMMObject(ename); 1289 return res.getNode(node.getNumber()); 1290 } 1291 1292 1298 public String getAuthType() { 1299 return authtype; 1300 } 1301 1302 1308 public String getLanguage() { 1309 return locale.getLanguage(); 1310 } 1311 1312 1316 public Locale getLocale() { 1317 return locale; 1318 } 1319 1320 1330 public TimeZone getTimeZone() { 1331 return timeZone; 1332 } 1333 1334 1335 1343 public String getEncoding() { 1344 return encoding; 1345 } 1346 1347 1351 public boolean getState() { 1352 return mmbaseState == STATE_UP; 1353 } 1354 1355 1360 public void checkUserLevel() { 1361 String level = System.getProperty("mmbase.userlevel"); 1362 if (level != null) { 1363 log.info("CheckUserLevel -> mmmbase.userlevel=" + System.getProperty("mmbase.userlevel")); 1364 int pos = level.indexOf(':'); 1365 if (pos != -1) { 1366 String user = level.substring(0, pos); 1367 String group = level.substring(pos + 1); 1368 setUser setuser = new setUser(); 1369 setuser.setUserGroup(user, group); 1370 } else { 1371 log.info("CheckUserLevel -> mmmbase.userlevel= not defined as user:group"); 1372 } 1373 } 1374 } 1375 1376 1381 private boolean checkBuilderVersion(String builderName, Versions ver) { 1382 1383 MMObjectBuilder tmp = (MMObjectBuilder) mmobjs.get(builderName); 1384 1385 if (tmp == null) { 1386 return false; 1387 } 1388 1389 if (tmp != null) { 1390 int version = tmp.getVersion(); 1391 String maintainer = tmp.getMaintainer(); 1392 1393 int installedversion = ver.getInstalledVersion(builderName, "builder"); 1394 if (installedversion == -1 || version > installedversion) { 1395 ver.setInstalledVersion(builderName, "builder", maintainer, version); 1396 } 1397 } 1398 return true; 1399 } 1400 1401 1419 public void addNodeRelatedEventsListener(String builder, org.mmbase.core.event.EventListener listener) { 1420 MMObjectBuilder b = getBuilder(builder); 1421 if(b != null){ 1422 if(listener instanceof NodeEventListener){ 1423 TypedNodeEventListenerWrapper tnelr = new TypedNodeEventListenerWrapper(b, (NodeEventListener)listener, true); 1424 EventManager.getInstance().addEventListener(tnelr); 1425 } 1426 if(listener instanceof RelationEventListener){ 1427 TypedRelationEventListenerWrapper trelr = new TypedRelationEventListenerWrapper(b, (RelationEventListener)listener, RelationStep.DIRECTIONS_BOTH, true); 1428 EventManager.getInstance().addEventListener(trelr); 1429 } 1430 } 1431 } 1432 1433 1439 public void removeNodeRelatedEventsListener(String builder, org.mmbase.core.event.EventListener listener) { 1440 MMObjectBuilder b = getBuilder(builder); 1441 if(b != null){ 1442 if(listener instanceof NodeEventListener){ 1443 TypedNodeEventListenerWrapper tnelr = new TypedNodeEventListenerWrapper(b, (NodeEventListener)listener, true); 1444 EventManager.getInstance().removeEventListener(tnelr); 1445 } 1446 if(listener instanceof RelationEventListener){ 1447 TypedRelationEventListenerWrapper trelr= new TypedRelationEventListenerWrapper(b, (RelationEventListener)listener, RelationStep.DIRECTIONS_BOTH, true); 1448 EventManager.getInstance().removeEventListener(trelr); 1449 1450 } 1451 } 1452 } 1453 1454 1455} 1456
| Popular Tags
|