<MyAddFieldPlugin Project>/src/org/myorg/myaddfieldplugin/AddAtomCountFieldAction.java
    /**
     * Creates a new integer Field (database column) in the specified Entity (database table).
     * Then invokes a method which fills all rows with data
     */
    private static void createNewField(DFEntity entity) {

        // For most of the following code please check DFNewType javadoc

        // To create new field we need to ask entity for its fields container.
        // This container provides so called new types (DFNewType), which can be used for creating
        // new fields in the entity. Let's get all available newtypes first
        List<DFNewType<DFField>> allNewTypes = entity.getFields().getNewTypes();

        // We need a new type which is able to create an integer field. It means DFField which has integer specific
        // capability (DFFieldIntegerCapability). We need a standard read/write database column, so we need to avoid
        // a new type which creates integer field for chemical terms (DFFieldChemicalTermsCapability).
        // So let's use utility method to filter new types.
        List<DFNewType<DFField>> appropritateNTs = DIFUtilities.findAllAppropriateNewTypes(allNewTypes, false,
                new Class[] { REQUIRED_FIELD_CAPABILITY },
                UNDESIRABLE_FIELD_CAPABILITIES);

        // We can't do anything if there is no such a new type
        if (appropritateNTs.isEmpty()) {
            return;
        }

        // If there are more than one new type which creates integer and non-chemical terms field, let's use the first one
        final DFNewType<DFField> nt = appropritateNTs.get(0);

        // We need to setup the options (parameters) for new field creation
        DFNewTypeOptions unknownNewTypeOptions = nt.getOptions();

        // We can use introspection to find out methods/properties which offers this options, but the more simple way
        // is to try to cast the given options to some expected well-know new type options. Some of them are predefined
        // in DFNewTypeWellKnownOptions interface and serves as a bridge between newtype provider and newtype users.
        // In this case we can expect NewDBField subinterface, so let's try it...
        if (unknownNewTypeOptions instanceof DFNewTypeWellKnownOptions.NewDBField) {
            DFNewTypeWellKnownOptions.NewDBField options = (DFNewTypeWellKnownOptions.NewDBField) unknownNewTypeOptions;

            // Setting safe name means that it's validated and if the given name doesn't work, it's "standardized"
            // (for example when name is some DB key word, is it's already used, etc.). This method call also generate
            // some default database column name.
            options.setNewDFItemNameSafe(NEW_FIELD_NAME);
        }

        String creatingFieldTaskName = NbBundle.getMessage(AddAtomCountFieldAction.class, "MSG_ProgressNameCreatingField");

        // The task can take some time, so let's execute it on background using UIBackgroundRunnerRW utility class.
        // The method phase1InRequestProcessor is executed on background, during this time the progress bar is moving in IJC main window
        // UIBackgroundRunnerRW is also helping with locking before DDL change and unlocking after that. We also need to provide
        // progress name and boolean flag if the task is cancellable.
        UIBackgroundRunnerRW runner = new UIBackgroundRunnerRW(DIFUtilities.getLockable(entity), creatingFieldTaskName, false) {
            private DFField newField;
            @Override
            public void phase1InRequestProcessor() {
                // Let's create the field
                newField = nt.create(getEnvironment()).iterator().next();
            }
            @Override
            public void phase2InAWT() {
                // phase2 is executed in AWT and it just invokes the method for filling the new field with data.
                fillData(newField);
            }
        };

        // task is prepared, we need to start it
        runner.start();
    }