public RegistryObjectType createRegistryObjectVersion(RegistryObjectType ro) throws RegistryException { RegistryObjectType roNew = null; try { Utility util = Utility.getInstance(); RegistryObjectType lastVersion = getLatestVersionOfRegistryObject(ro); String nextVersion = null; if (lastVersion == null) { nextVersion = "1.1"; } else { nextVersion = nextVersion(lastVersion.getVersionInfo().getVersionName()); } roNew = bu.cloneRegistryObject(ro); VersionInfoType nextVersionInfo = bu.rimFac.createVersionInfoType(); nextVersionInfo.setVersionName(nextVersion); // Set the comment from the request comment (per the spec) if (!context.getRegistryRequestStack().empty()) { nextVersionInfo.setComment(context.getCurrentRegistryRequest().getComment()); } roNew.setVersionInfo(nextVersionInfo); // A new version must have a unique id String id = ro.getId(); String lid = ro.getLid(); String idNew = id; // Only change id if it already exists in versions // Need to preserve client supplied id in the case where lid is an // existing lid but id is new if (isIdInVersions(id)) { // Make id of next version be lid with ":nextVersion" as suffix, if this id is already in // use in a version idNew = lid + ":" + nextVersion; // Utility.getInstance().createId(); roNew.setId(idNew); // Add entry to idMap so old id and refs to it are mapped to idNew context.getIdMap().put(id, idNew); } // Add entry to context.newROVersionMap for later replacement context.getNewROVersionMap().put(ro, roNew); // Assign new ids to all composed RegistryObjects within roNew Set composedObjects = bu.getComposedRegistryObjects(roNew, -1); Iterator iter = composedObjects.iterator(); while (iter.hasNext()) { RegistryObjectType composedObject = (RegistryObjectType) iter.next(); // check for composed object if exist change the id and lid and // also update the idMap. if (objectExists(composedObject.getId())) { String oldId = composedObject.getId(); String newId = oldId + ":" + nextVersion; composedObject.setId(newId); composedObject.setLid(newId); context.getIdMap().put(oldId, newId); } String composedId = composedObject.getId(); String composedLid = composedObject.getLid(); String composedIdNew = composedId; if (!util.isValidRegistryId(composedId)) { // Replace the id if it's not a valid ID already composedIdNew = util.createId(); composedObject.setId(composedIdNew); // Add entry to idMap so old composedId and refs to it are mapped to composedIdNew context.getIdMap().put(composedId, composedIdNew); } if (composedLid == null || composedLid.trim().length() == 0) { composedObject.setLid(composedIdNew); } // Set the parent id of this composed object to point to the new parent bu.setParentIdForComposedObject(composedObject, idNew); } } catch (JAXRException e) { throw new RegistryException(e); } catch (JAXBException e) { throw new RegistryException(e); } return roNew; }