public boolean drop()

in openjpa-kernel/src/main/java/org/apache/openjpa/meta/AbstractCFMetaDataFactory.java [277:365]


    public boolean drop(Class[] cls, int mode, ClassLoader envLoader) {
        if (mode == MODE_NONE)
            return true;
        if (isMappingOnlyFactory() && (mode & MODE_MAPPING) == 0)
            return true;

        Parser parser = newParser(false);
        MetaDataRepository pr = parser.getRepository();
        pr.setSourceMode(MODE_MAPPING, false);
        pr.setResolve(MODE_MAPPING, false);

        // parse metadata for all these classes
        if ((mode & (MODE_META | MODE_MAPPING)) != 0) {
            parser.setMode((isMappingOnlyFactory()) ? mode
                : MODE_META | MODE_MAPPING | MODE_QUERY);
            parse(parser, cls);
        }
        if (!isMappingOnlyFactory() && (mode & MODE_QUERY) != 0) {
            parser.setMode(MODE_QUERY);
            parse(parser, cls);
        }

        // remove metadatas from repository or clear their mappings
        Set files = new HashSet();
        Set clsNames = null;
        if ((mode & (MODE_META | MODE_MAPPING)) != 0) {
            clsNames = new HashSet((int) (cls.length * 1.33 + 1));
            ClassMetaData meta;
            for (Class cl : cls) {
                if (cl == null)
                    clsNames.add(null);
                else
                    clsNames.add(cl.getName());
                meta = pr.getMetaData(cl, envLoader, false);
                if (meta != null) {
                    if (getSourceFile(meta) != null)
                        files.add(getSourceFile(meta));
                    if ((mode & MODE_META) != 0)
                        pr.removeMetaData(meta);
                    else if (!isMappingOnlyFactory())
                        clearMapping(meta);
                }
            }
        }

        // remove query mode metadatas so we can store them separately
        QueryMetaData[] queries = pr.getQueryMetaDatas();
        List qqs = (!isMappingOnlyFactory() && (mode & MODE_QUERY) == 0)
            ? null : new ArrayList();
        boolean rem;
        Class def;
        for (QueryMetaData query : queries) {
            if (!isMappingOnlyFactory() && query.getSourceFile() != null)
                files.add(query.getSourceFile());
            def = query.getDefiningType();
            rem = (query.getSourceMode() & mode) != 0
                    && clsNames.contains((def == null) ? null : def.getName());
            if (rem || (!isMappingOnlyFactory()
                    && query.getSourceMode() == MODE_QUERY))
                pr.removeQueryMetaData(query);
            if (qqs != null && query.getSourceMode() == MODE_QUERY && !rem)
                qqs.add(query);
        }

        // write new metadata without removed instances
        backupAndDelete(files);
        Serializer ser;
        if ((mode & (MODE_META | MODE_MAPPING)) != 0) {
            ser = newSerializer();
            ser.setMode((isMappingOnlyFactory()) ? mode : mode | MODE_META);
            ser.addAll(pr);
            // remove from serializer rather than from repository above so that
            // calling code can take advantage of metadata still in repos
            if (isMappingOnlyFactory())
                for (Class cl : cls)
                    ser.removeMetaData(pr.getMetaData(cl, envLoader,
                            false));
            serialize(ser, null, MetaDataSerializer.PRETTY);
        }
        if (qqs != null && !qqs.isEmpty()) {
            ser = newSerializer();
            ser.setMode(MODE_QUERY);
            for (Object qq : qqs) {
                ser.addQueryMetaData((QueryMetaData) qq);
            }
            serialize(ser, null, MetaDataSerializer.PRETTY);
        }
        return true;
    }