soc.modifyComponentData(theSoc, pdb);
soc.modifyComponentData(completeSociety, pdb);
  public void saveToDb(DBConflictHandler ch) {    if (!modified) {      if (log.isDebugEnabled())         log.debug("Save to database not needed; experiment not modified");      return;    }    try {      updateNameServerHostName(); // Be sure this is up-to-date      Set writtenNodes = new HashSet();      List components = getComponents();      NodeComponent[] nodesToWrite = getNodes();      ComponentData theSoc = new GenericComponentData();      theSoc.setType(ComponentData.SOCIETY);      theSoc.setName(getExperimentName()); // this should be experiment: trial FIXME      theSoc.setClassName("java.lang.Object"); // Must not be null      theSoc.setOwner(this); // the experiment      theSoc.setParent(null);      addDefaultNodeArguments(theSoc);      PopulateDb pdb = null;      if(fromFile) {	// Created with a SocietyFileComponent	// Have no CMT assembly, nor previous	// experiment or trial ID.	// So save it all in the CSMI assembly        pdb =          new PopulateDb("CSHNA", "CSMI", getExperimentName(),                         null, null, ch);      } else {	// We'll clear out the old non-CMT assemblies,	// save everything in CMT / CSMI        pdb =          new PopulateDb("CMT", "CSHNA", "CSMI", getExperimentName(),                         getExperimentID(), trialID, ch);      }      setExperimentID(pdb.getExperimentId());      setTrialID(pdb.getTrialId()); // sets trial id and -D argument      // For each node, create a GenericComponentData, and add it to the society      for (Iterator i = hosts.iterator(); i.hasNext(); ) {        ExperimentHost host = (ExperimentHost) i.next();        ComponentData hc = new GenericComponentData();        hc.setType(ComponentData.HOST);        hc.setName(host.getShortName());        hc.setClassName("");        hc.setOwner(this);        hc.setParent(theSoc);        addPropertiesAsParameters(hc, host);        theSoc.addChild(hc);        NodeComponent[] nodes = host.getNodes();        for (int j = 0; j < nodes.length; j++) {          saveNodeToDb(nodes[j], hc);          writtenNodes.add(nodes[j]);        }      }      for (int i = 0; i < nodesToWrite.length; i++) {        if (writtenNodes.contains(nodesToWrite[i])) continue;        saveNodeToDb(nodesToWrite[i], theSoc);        writtenNodes.add(nodesToWrite[i]);      }      // Some components will want access to the complete set of Nodes      // in the society, etc. To get that, they must get back to the      // root soc object, and do a getOwner and go from there. Ugly.      if(log.isDebugEnabled()) {        log.debug("Adding All Components");      }      // So far we've just created the pdb (which      // sets up the Experimet & Trial IDs, and puts the CMT assembly      // in the right place if necc, and clears out the other       // assemblies (CSMI, CSHNA)      // Now ask each component in turn to add its stuff      boolean componentWasRemoved = false;      for (int i = 0, n = components.size(); i < n; i++) {        BaseComponent soc = (BaseComponent) components.get(i);        if(log.isDebugEnabled()) {          log.debug(soc + ".addComponentData");        }        soc.addComponentData(theSoc);	// Components can notice here if they had to remove	// a component (or, I suppose, modify)        componentWasRemoved |= soc.componentWasRemoved();	// Note that no current component returns true here      }      // If any component removed something, we need      // to recreate the CMT assembly (under the original ID)      // So this, currently destroys the orig CMT      // Note also it does not effect Agent asset data      // or relationships or OPLAN stuff      if (componentWasRemoved) pdb.repopulateCMT(theSoc);      pdb.populateHNA(theSoc);      // then give everyone a chance to modify what they've collectively produced      for (int i = 0, n = components.size(); i < n; i++) {        BaseComponent soc = (BaseComponent) components.get(i);        soc.modifyComponentData(theSoc, pdb);        if (soc.componentWasRemoved()) {          pdb.repopulateCMT(theSoc);        }        pdb.populateCSMI(theSoc);      }      pdb.setModRecipes(recipes);      pdb.close();      theWholeSoc = theSoc;    } catch (Exception sqle) {      if (log.isErrorEnabled())	log.error("Error saving experiment to database: ", sqle);      return;    }    modified = false;  }