@Override
<T extends DelegatedResourceSnapshot> T createAttachedResource(
Class<? extends T> snapshotClass,
String attachmentId,
Name<?> name,
Class<? extends ResourceHandler> handlerClass,
DelegatedResourceSnapshot ctx) {
AttachedTemplate attachedTemplate = template().attachedTemplate(attachmentId);
checkState(attachedTemplate!=null,"No attachment '%s' is defined for template '%s'",attachmentId,template());
checkState(attachedTemplate.template().handlerClass().isAssignableFrom(handlerClass),"Attachment '%s' of template '%s' is not compatible with '%s' (%s)",attachmentId,template().id(),handlerClass.getCanonicalName(),attachedTemplate.template().handlerClass().getCanonicalName());
checkState(nameFilterForAttachment(attachmentId).isValid(name),"Resource name '%s' is already in use",name);
T newSnapshot= ctx.newChildResource(ResourceId.createId(name,attachedTemplate.template()),snapshotClass);
DelegatedAttachmentSnapshot newAttachment = AttachmentSnapshotCollection.newAttachment(attachmentId, newSnapshot);
this.attachments.add(newAttachment);
UnitOfWork.getCurrent().registerDirty(ctx);
newSnapshot.markNew();
if(LOGGER.isTraceEnabled()) {
LOGGER.trace("Attached '{}' as '{}' to '{}'",newSnapshot.resourceId(),attachmentId,ctx.resourceId());
}
return snapshotClass.cast(newSnapshot);
}