Ejemplo n.º 1
0
DataElement* ModelServicesImp::createElement(const DataDescriptor* pDescriptor, const string& id)
{
    const DataDescriptorImp* pDescriptorImp = dynamic_cast<const DataDescriptorImp*>(pDescriptor);
    if (pDescriptorImp == NULL)
    {
        return NULL;
    }
    if (pDescriptorImp->getParent() == NULL && !pDescriptorImp->getParentDesignator().empty())
    {
        // Set the parent element pointer into the data descriptor if the descriptor was created with the designator
        DataElement* pParent = getElement(pDescriptorImp->getParentDesignator(), string());
        if (pParent == NULL)
        {
            // The parent element does not exist, so do not create the element
            return NULL;
        }

        const_cast<DataDescriptorImp*>(pDescriptorImp)->setParent(pParent);
    }

    // Check if an element with the same name, type, and parent already exists
    const string& name = pDescriptorImp->getName();
    const string& type = pDescriptorImp->getType();
    DataElement* pParent = pDescriptorImp->getParent();

    if (getElement(name, type, pParent) != NULL)
    {
        return NULL;
    }

    // Create the element
    DataElement* pElement = NULL;
    if ((type == "AnnotationElement") || (type == "AnnotationElementAdapter"))
    {
        pElement = new AnnotationElementAdapter(*pDescriptorImp, id);
    }
    else if ((type == "AoiElement") || (type == "AoiElementAdapter"))
    {
        pElement = new AoiElementAdapter(*pDescriptorImp, id);
    }
    else if ((type == "DataElement") || (type == "DataElementAdapter"))
    {
        pElement = new DataElementAdapter(*pDescriptorImp, id);
    }
    else if ((type == "DataElementGroup") || (type == "DataElementGroupAdapter"))
    {
        pElement = new DataElementGroupAdapter(*pDescriptorImp, id);
    }
    else if ((type == "GcpList") || (type == "GcpListAdapter"))
    {
        pElement = new GcpListAdapter(*pDescriptorImp, id);
    }
    else if ((type == "RasterElement") || (type == "RasterElementAdapter"))
    {
        const RasterDataDescriptor* pRasterDescriptor = dynamic_cast<const RasterDataDescriptor*>(pDescriptor);
        if (pRasterDescriptor != NULL)
        {
            RasterElement* pRaster = new RasterElementAdapter(*pDescriptorImp, id);

            if (pRaster != NULL)
            {
                if (pDescriptorImp->getProcessingLocation() == IN_MEMORY)
                {
                    if (!pRaster->createInMemoryPager())
                    {
                        delete dynamic_cast<RasterElementImp*>(pRaster);
                        pRaster = NULL;
                    }
                }
            }
            pElement = pRaster;
        }
    }
    else if ((type == "Signature") || (type == "SignatureAdapter"))
    {
        pElement = new SignatureAdapter(*pDescriptorImp, id);
    }
    else if ((type == "SignatureLibrary") || (type == "SignatureLibraryAdapter"))
    {
        pElement = new SignatureLibraryAdapter(*pDescriptorImp, id);
    }
    else if ((type == "SignatureSet") || (type == "SignatureSetAdapter"))
    {
        pElement = new SignatureSetAdapter(*pDescriptorImp, id);
    }
    else if ((type == "TiePointList") || (type == "TiePointListAdapter"))
    {
        pElement = new TiePointListAdapter(*pDescriptorImp, id);
    }
    else if ((type == "Any") || (type == "AnyAdapter") || (hasElementType(type) == true))
    {
        pElement = new AnyAdapter(type, *pDescriptorImp, id);
    }

    if (pElement != NULL)
    {
        // Add the element to the session
        addElement(pElement);

        // Notify of change
        notify(SIGNAL_NAME(ModelServices, ElementCreated), boost::any(pElement));
    }

    return pElement;
}