This experimental tool uses the DDMSence library to create a DDMS 5.0 assertion from form input. The assertion is not a complete record on its own, but is intended for insertion into a Trusted Data Object in the IC Trusted Data Format (TDF) specification. It uses the Component Builder framework. To simplify the example source code, the form only asks for a minimal subset of elements and attributes required for a valid resource. Information submitted through this tool is not retained on the server.
Starred fields (*) are required.
Compilable source code for this tool is not bundled with DDMSence, because it has dependencies on the Spring Framework (v3.2.2). However, all of the pieces you need create a similar web application are shown below. A basic understanding of Spring MVC will be necessary to understand the code.
builder.uri
.package buri.urizone.web.control.ddmsence; import java.io.ByteArrayOutputStream; import java.util.Set; import nu.xom.Document; import nu.xom.Serializer; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.SessionAttributes; import org.springframework.web.bind.support.SessionStatus; import buri.ddmsence.ddms.InvalidDDMSException; import buri.ddmsence.ddms.Resource; import buri.ddmsence.ddms.ValidationMessage; import buri.ddmsence.ddms.security.ism.ISMVocabulary; import buri.ddmsence.util.DDMSVersion; import buri.ddmsence.util.PropertyReader; import buri.ddmsence.util.Util; import buri.urizone.web.AbstractControl; /** * Controller class for building DDMS Records * * @author Brian Uri! */ @Controller @SessionAttributes({ "resource" }) public class BuilderControl extends AbstractControl { /** * Entry point for creating a new builder */ @RequestMapping(value = "/builder.uri", method = RequestMethod.GET) public String newForm(Model model) { Resource.Builder builder = new Resource.Builder(); model.addAttribute("resource", builder); return ("builder"); } /** * Entry point for saving the builder */ @RequestMapping(value = "/builder.uri", method = RequestMethod.POST) public String build(@ModelAttribute("resource") Resource.Builder builder, BindingResult result, SessionStatus status, Model model) { try { DDMSVersion.setCurrentVersion("5.0"); PropertyReader.setProperty("output.json.prettyPrint", "true"); PropertyReader.setProperty("output.indexLevel", "1"); Resource resource = builder.commit(); if (resource == null) throw new InvalidDDMSException("No information was entered to create a DDMS Resource."); // Skipping resource.toXML() so I can control formatting. Document document = new Document(resource.getXOMElementCopy()); ByteArrayOutputStream os = new ByteArrayOutputStream(); Serializer serializer = new Serializer(os, "ISO-8859-1"); serializer.setIndent(3); serializer.setMaxLength(120); serializer.write(document); model.addAttribute("xml", os.toString()); model.addAttribute("html", resource.toHTML()); model.addAttribute("text", resource.toText()); model.addAttribute("json", resource.toJSON()); model.addAttribute("warnings", resource.getValidationWarnings()); return ("builderResult"); } catch (InvalidDDMSException e) { ValidationMessage message = ValidationMessage.newError(e.getMessage(), e.getLocator()); String location = Util.isEmpty(message.getLocator()) ? "unknown location" : message.getLocator(); result.reject(null, null, "<b>" + message.getType() + "</b> at <code>" + location + "</code>: " + message.getText()); } catch (Exception e) { result.reject(e.getMessage()); } return ("builder"); } /** * Accessor for the allowable ownerProducer values */ @ModelAttribute(value = "ownerProducers") private Set<String> getOwnerProducers() { return (ISMVocabulary.getEnumerationTokens(DDMSVersion.getVersionFor("5.0"), ISMVocabulary.CVE_OWNER_PRODUCERS)); } }
newForm()
method.
This is a Component Builder which supports the form you see on this page. If you wanted your form to edit an existing Resource,
you could initialize the builder by passing in a Resource instance.build()
method of the BuilderControl is called. This method commits the Resource.Builder.
It will fail immediately with an InvalidDDMSException
if the Resource is invalid.