private Revision parse()

in taverna-scufl2-wfbundle/src/main/java/org/apache/taverna/scufl2/rdfxml/RevisionParser.java [86:156]


	private Revision parse(URI base, VersionableResource verResource,
			Map<URI, Revision> revisions) throws ReaderException {
		URI uri = base.resolve(verResource.getAbout());
		Revision revision = addOrExisting(uri, revisions);

		if (verResource.getGeneratedAtTime() != null) {
			XMLGregorianCalendar xmlCal = verResource.getGeneratedAtTime()
					.getValue();
			revision.setGeneratedAtTime(xmlCal.toGregorianCalendar());
		}

		Resource wasRevisionOf = verResource.getWasRevisionOf();
		if (wasRevisionOf != null) {
			// TODO Put these in a map
			Revision r = addOrExisting(
					base.resolve(wasRevisionOf.getResource()), revisions);
			revision.setPreviousRevision(r);
		}

		if (verResource.getWasChangedBy() != null) {
			ChangeSpecification changeSpec = verResource.getWasChangedBy()
					.getChangeSpecification();
			if (changeSpec.getFromVersion() != null) {
				Revision r = addOrExisting(
						base.resolve(changeSpec.getFromVersion().getResource()),
						revisions);
				if (revision.getPreviousRevision() != null
						&& revision.getPreviousRevision() != r)
					throw new ReaderException(
							"Inconsistent previous revision: "
									+ revision.getPreviousRevision()
											.getIdentifier() + " or "
									+ r.getIdentifier());
				revision.setPreviousRevision(r);
			}

			if (changeSpec.getType() != null)
				revision.setChangeSpecificationType(base.resolve(changeSpec
						.getType().getResource()));

			for (HasChange hasChange : changeSpec.getHasChange()) {
				if (hasChange.getAddition() != null) {
					Set<URI> additions = parse(hasChange.getAddition(), base);
					// Note: Use addAll in case a buggy XML has multiple
					// <hasChange><Addition>
					revision.getAdditionOf().addAll(additions);
				}
				if (hasChange.getModification() != null) {
					Set<URI> modifications = parse(hasChange.getModification(),
							base);
					revision.getModificationsOf().addAll(modifications);
				}
				if (hasChange.getRemoval() != null) {
					Set<URI> removals = parse(hasChange.getRemoval(), base);
					revision.getRemovalOf().addAll(removals);
				}
			}
		}

		for (Resource assoc : verResource.getWasAttributedTo())
			revision.getWasAttributedTo()
					.add(base.resolve(assoc.getResource()));

		for (Resource assoc : verResource.getHadOriginalSource()) {
			Revision r = addOrExisting(base.resolve(assoc.getResource()),
					revisions);
			revision.getHadOriginalSources().add(r);
		}

		return revision;
	}