public void createChild()

in eclipse/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/model/JcrNode.java [801:896]


	public void createChild(final String childNodeName, final String childNodeType) {
	    String thisNodeType = getPrimaryType();
	    final SerializationKind parentSk = getSerializationKind(thisNodeType);
        final SerializationKind childSk = getSerializationKind(childNodeType);

        final SerializationManager serializationManager = Activator.getDefault().getSerializationManager();
	    
	    if (parentSk==SerializationKind.METADATA_FULL) {
	        createDomChild(childNodeName, childNodeType);
	    } else if (parentSk==SerializationKind.FILE) {
            throw new IllegalStateException("cannot create child of nt:file");
	    } else if (childSk==SerializationKind.FOLDER) {
            IWorkspaceRunnable r = new IWorkspaceRunnable() {

                @Override
                public void run(IProgressMonitor monitor) throws CoreException {
                    IFolder newFolder = prepareCreateFolderChild(childNodeName);
                    if (parentSk==SerializationKind.METADATA_PARTIAL) {
                        // when the parent is partial and we're creating a folder here,
                        // then we're running into a SLING-3639 type of problem
                        // the way around this is to make a 'pointer' in the 'root'
                        // .content.xml, and have a directory structure leaving to
                        // the new node, together with a .content.xml describing
                        // the type (unless it's a nt:folder that is)
                        
                        // 1) 'pointer' in the 'root .content.xml'
                        createDomChild(childNodeName, null);
                        
                        // 2) directory structure is created above already
                        // 3) new .content.xml is done below
                    }
                    if (!childNodeType.equals("nt:folder")) {
                        createVaultFile(newFolder, ".content.xml", childNodeType);
                    }
                }
            };
	        
	        try {
	            ResourcesPlugin.getWorkspace().run(r, null);
	            if (childNodeType.equals("nt:folder") && parentSk==SerializationKind.FOLDER) {
	                // trigger a publish, as folder creation is not propagated to 
	                // the SlingLaunchpadBehavior otherwise
	                //TODO: make configurable? Fix in Eclipse/WST?
	                ServerUtil.triggerIncrementalBuild(resource, null);
	            }
	        } catch (CoreException e) {
	            Activator.getDefault().getPluginLogger().error("Error creating child "+childNodeName+": "+e, e);
	            e.printStackTrace();
	            MessageDialog.openError(Display.getDefault().getActiveShell(), "Error creating node", "Error creating child of "+thisNodeType+" with type "+childNodeType+": "+e);
	            return;
	        }
        } else if ((parentSk == SerializationKind.FOLDER || parentSk == SerializationKind.METADATA_PARTIAL)
                && childSk == SerializationKind.METADATA_FULL) {
            createVaultFile((IFolder) resource, serializationManager.getLocalName(childNodeName) + ".xml", childNodeType);
	    } else if (parentSk==SerializationKind.FOLDER && childSk==SerializationKind.METADATA_PARTIAL) {
//	        createVaultFile((IFolder)resource, childNodeName+".xml", childNodeType);

            IWorkspaceRunnable r = new IWorkspaceRunnable() {

                @Override
                public void run(IProgressMonitor monitor) throws CoreException {
                    IFolder f = (IFolder)resource;
                    IFolder newFolder = null;
                    newFolder = f.getFolder(serializationManager.getLocalName(childNodeName));
                    newFolder.create(true, true, new NullProgressMonitor());
                    createVaultFile(newFolder, ".content.xml", childNodeType);
                }
            };
            
            try {
                ResourcesPlugin.getWorkspace().run(r, null);
            } catch (CoreException e) {
                Activator.getDefault().getPluginLogger().error("Error creating child "+childNodeName+": "+e, e);
                e.printStackTrace();
                MessageDialog.openError(Display.getDefault().getActiveShell(), "Error creating node", "Error creating child of "+thisNodeType+" with type "+childNodeType+": "+e);
                return;
            }
            
	    } else if (parentSk!=SerializationKind.FOLDER && childSk==SerializationKind.METADATA_PARTIAL) {
            createDomChild(childNodeName, childNodeType);
	    } else {
	        if (childNodeType.equals("nt:file")) {
	            IFolder f = (IFolder)resource;
	            createNtFile(f, childNodeName, childNodeType);
	            return;
	        }
	        //TODO: FILE not yet supported

            Activator.getDefault().getPluginLogger()
                    .error("Cannot create child node of type " + childNodeType + ", serializationKind " + childSk
                            + " under child node of type " + thisNodeType + ", serializationKind " + parentSk);

	        MessageDialog.openWarning(Display.getDefault().getActiveShell(), "Error creating node", "Cannot create child of "+thisNodeType+" with type "+childNodeType+" (yet?)");
	        return;
	    }
	}