blob: d8ffa0e03c7f60a04864aaf8d28e7e623ab26f5e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.persistence.internal.oxm.record;
import org.eclipse.persistence.internal.oxm.Constants;
import org.eclipse.persistence.internal.oxm.ContainerValue;
import org.eclipse.persistence.internal.oxm.Reference;
import org.eclipse.persistence.internal.oxm.XPathFragment;
import org.eclipse.persistence.internal.oxm.mappings.Mapping;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.oxm.sequenced.SequencedObject;
import org.eclipse.persistence.oxm.sequenced.Setting;
public class SequencedUnmarshalContext implements UnmarshalContext {
private Setting currentSetting;
public void startElement(UnmarshalRecord unmarshalRecord) {
Setting parentSetting;
if(null == currentSetting) {
parentSetting = null;
} else if(Constants.TEXT.equals(currentSetting.getName())) {
parentSetting = null;
} else {
parentSetting = currentSetting;
}
XPathFragment xPathFragment = unmarshalRecord.getXPathNode().getXPathFragment();
if(null != xPathFragment) {
currentSetting = new Setting(xPathFragment.getNamespaceURI(), xPathFragment.getLocalName());
} else {
currentSetting = new Setting();
}
int levelIndex = unmarshalRecord.getLevelIndex();
if(0 == levelIndex) {
} else if(1 == levelIndex) {
((SequencedObject) unmarshalRecord.getCurrentObject()).getSettings().add(currentSetting);
} else {
parentSetting.addChild(currentSetting);
}
}
public void characters(UnmarshalRecord unmarshalRecord) {
if(null == currentSetting || null == currentSetting.getName()) {
currentSetting = new Setting(null, Constants.TEXT);
((SequencedObject) unmarshalRecord.getCurrentObject()).getSettings().add(currentSetting);
}else if(!Constants.TEXT.equals(currentSetting.getName())) {
Setting parentSetting = currentSetting;
currentSetting = new Setting(null, Constants.TEXT);
if(null != parentSetting) {
parentSetting.addChild(currentSetting);
}
}
}
public void endElement(UnmarshalRecord unmarshalRecord) {
if(null == currentSetting) {
return;
}
if(Constants.TEXT.equals(currentSetting.getName())) {
if(null == currentSetting.getParent()) {
currentSetting = null;
} else {
currentSetting = currentSetting.getParent().getParent();
}
} else {
currentSetting = currentSetting.getParent();
}
}
public void setAttributeValue(UnmarshalRecord unmarshalRecord, Object value, Mapping mapping) {
currentSetting.setMapping((DatabaseMapping) mapping);
currentSetting.setObject(unmarshalRecord.getCurrentObject());
currentSetting.setValue(value);
}
public void addAttributeValue(UnmarshalRecord unmarshalRecord, ContainerValue containerValue, Object value) {
addAttributeValue(unmarshalRecord, containerValue, value, unmarshalRecord.getContainerInstance(containerValue));
}
public void addAttributeValue(UnmarshalRecord unmarshalRecord, ContainerValue containerValue, Object value, Object collection) {
currentSetting.setMapping((DatabaseMapping) containerValue.getMapping());
currentSetting.setObject(unmarshalRecord.getCurrentObject());
currentSetting.addValue(value, true, collection);
}
public void reference(Reference reference) {
currentSetting.setObject(reference.getSourceObject());
currentSetting.setMapping((DatabaseMapping) reference.getMapping());
reference.setSetting(currentSetting);
}
public void unmappedContent(UnmarshalRecord unmarshalRecord) {
Setting parentSetting = currentSetting.getParent();
if(null == parentSetting) {
((SequencedObject)unmarshalRecord.getCurrentObject()).getSettings().remove(currentSetting);
}
currentSetting = parentSetting;
}
}