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;
}