protected Object parseLogicalStruct(String oid, Div div, CompositeItem parent)
throws DAOException {
if ("page".equals(div.getTYPE()) || div.getDivCount() == 0) {
if (div.getFptrCount() > 0) {
Fptr fptr = div.getFptr(0);
File file = (File) fptr.getFILEID();
String groupId = file.getGROUPID();
AtomicItem item = metsObj.getAtomicItemByID(groupId);
item.setParent(parent);
return item;
} else if (div.getMptrCount() > 0) {
Mptr mptr = div.getMptr(0);
MetsPointerAtomicItem item = new MetsPointerAtomicItem();
item.setType(div.getTYPE());
item.setLabel(div.getLABEL());
item.setParent(parent);
item.setHref(mptr.getHref());
return item;
} else {
return null;
}
} else {
String type = div.getTYPE();
String label = div.getLABEL();
CompositeItem division = new CompositeItem();
division.setType(type);
division.setLabel(label);
if (div.getCONTENTIDSCount() > 0) {
division.setContentId(div.getCONTENTIDS(0));
}
if (StringUtils.isBlank(div.getID())) {
division.setId(generateUniqueID());
} else {
division.setId(div.getID());
}
metsObj.getCompositeItemMap().put(division.getId(), division);
if (div.getDMDIDCount() == 1) {
DmdSec dmd = (DmdSec) div.getDMDID(0);
division.setDmdID(dmd.getID());
}
Div[] divs = div.getDiv();
division.setChildren(new ArrayList<AbstractItem>(divs.length));
for (int i = 0; i < divs.length; i++) {
Div d = divs[i];
Object obj = parseLogicalStruct(oid, d, division);
if (obj instanceof AtomicItem) {
// Add page to division's child list
division.addChild((AtomicItem) obj);
if (i == 0) {
division.setFirst((AtomicItem) obj);
}
if (i == divs.length - 1) {
division.setLast((AtomicItem) obj);
}
} else if (obj instanceof CompositeItem) {
division.addChild((CompositeItem) obj);
if (i == 0) {
division.setFirst(((CompositeItem) obj).getFirst());
}
if (i == divs.length - 1) {
division.setLast(((CompositeItem) obj).getLast());
}
}
}
Fptr[] fptrs = div.getFptr();
ParameterMap dataStream = config.getDataStream();
if (dataStream != null) {
Map<String, Map<String, String>> valueMap = dataStream.getValueMap();
for (Map.Entry<String, Map<String, String>> entry : valueMap.entrySet()) {
Map<String, String> stream = new HashMap<String, String>();
for (Fptr fptr2: fptrs) {
File file = (File)fptr2.getFILEID();
String use = file.getUSE();
if (entry.getValue().get(use) != null) {
stream.put(use, file.getFLocat(0).getHref());
}
}
division.getDataStreamsMap().put(entry.getKey(), stream);
}
}