package org.openprovenance.prov.model;
import java.util.List;
import java.util.LinkedList;
import org.openprovenance.prov.model.extension.QualifiedAlternateOf;
import org.openprovenance.prov.model.extension.QualifiedHadMember;
import org.openprovenance.prov.model.extension.QualifiedSpecializationOf;
/** Generic Traversal of a PROV model bean.
* Makes use of the "visitor" in {@link ProvUtilities#doAction(StatementOrBundle, StatementActionValue)}
*
* @author lavm
*
*/
public class BeanTraversal implements StatementActionValue {
final private ModelConstructor c;
final private ProvFactory pFactory;
ProvUtilities u=new ProvUtilities();
public BeanTraversal(ModelConstructor c, ProvFactory pFactory) {
this.c=c;
this.pFactory=pFactory;
}
public ActedOnBehalfOf doAction(ActedOnBehalfOf del) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(del,attrs);
convertLabelAttributes(del,attrs);
convertAttributes(del,attrs);
return c.newActedOnBehalfOf(del.getId(), del.getDelegate(), del.getResponsible(), del.getActivity(), attrs);
}
public Activity doAction(Activity e) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(e,attrs);
convertLabelAttributes(e,attrs);
convertLocationAttributes(e,attrs);
convertAttributes(e,attrs);
return c.newActivity(e.getId(), e.getStartTime(), e.getEndTime(), attrs);
}
public Agent doAction(Agent e) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(e,attrs);
convertLabelAttributes(e,attrs);
convertLocationAttributes(e,attrs);
convertAttributes(e,attrs);
return c.newAgent(e.getId(), attrs);
}
public AlternateOf doAction(AlternateOf o) {
return c.newAlternateOf(o.getAlternate1(), o.getAlternate2());
}
public Relation doAction(DerivedByInsertionFrom o) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(o,attrs);
convertLabelAttributes(o,attrs);
convertAttributes(o,attrs);
return c.newDerivedByInsertionFrom(o.getId(),
o.getNewDictionary(),
o.getOldDictionary(),
o.getKeyEntityPair(),
attrs);
}
public Relation doAction(DerivedByRemovalFrom o) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(o,attrs);
convertLabelAttributes(o,attrs);
convertAttributes(o,attrs);
return c.newDerivedByRemovalFrom(o.getId(),
o.getNewDictionary(),
o.getOldDictionary(),
o.getKey(),
attrs);
}
public Relation doAction(DictionaryMembership o) {
return c.newDictionaryMembership(o.getDictionary(), o.getKeyEntityPair());
}
public Document doAction(Document doc) {
List<Bundle> bRecords = new LinkedList<Bundle>();
List<Statement> sRecords = new LinkedList<Statement>();
Namespace docNamespace=doc.getNamespace();
Namespace.withThreadNamespace(docNamespace);
c.startDocument(doc.getNamespace());
for (Statement s : u.getStatement(doc)) {
sRecords.add((Statement) u.doAction(s, this));
}
for (Bundle bu : u.getNamedBundle(doc)) {
Namespace.withThreadNamespace(new Namespace(docNamespace));
Bundle o = doAction(bu,u);
if (o != null)
bRecords.add(o);
}
return c.newDocument(doc.getNamespace(), sRecords, bRecords);
}
public Entity doAction(Entity e) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(e,attrs);
convertLabelAttributes(e,attrs);
convertLocationAttributes(e,attrs);
convertValueAttributes(e,attrs);
convertAttributes(e,attrs);
return c.newEntity(e.getId(), attrs);
}
//TODO: only supporting one member in the relation
// note: lots of test to support scruffy provenance
public HadMember doAction(HadMember o) {
List<QualifiedName> qq=new LinkedList<QualifiedName>();
if (o.getEntity()!=null) {
for (QualifiedName eid:o.getEntity()) {
qq.add(eid);
}
}
return c.newHadMember(o.getCollection(), qq);
/*remember, scruffy hadmember in provn, has a null in get(0)!!
return deprecated.convertHadMember(deprecated.doAction((o.getCollection()==null) ? null:
o.getCollection().getRef()),
((o.getEntity()==null || (o.getEntity().isEmpty())) ?
deprecated.doAction(null) :
deprecated.doAction((o.getEntity().get(0)==null) ?
null :
o.getEntity().get(0).getRef()))); */
}
public MentionOf doAction(MentionOf o) {
return c.newMentionOf(o.getSpecificEntity(),
o.getGeneralEntity(),
o.getBundle());
}
public Bundle doAction(Bundle b, ProvUtilities u) {
List<Statement> sRecords = new LinkedList<Statement>();
QualifiedName bundleId=b.getId();
Namespace old=Namespace.getThreadNamespace();
Namespace bundleNamespace;
if (b.getNamespace()!=null) {
bundleNamespace=new Namespace(b.getNamespace());
} else {
bundleNamespace=new Namespace();
}
bundleNamespace.setParent(new Namespace(old)); //ensure to make a copy of old, since setting might otherwise create a loop
Namespace.withThreadNamespace(bundleNamespace);
c.startBundle(bundleId, b.getNamespace());
for (Statement s : u.getStatement(b)) {
sRecords.add((Statement) u.doAction(s, this));
}
return c.newNamedBundle(bundleId, b.getNamespace(), sRecords);
}
public SpecializationOf doAction(SpecializationOf o) {
return c.newSpecializationOf(o.getSpecificEntity(), o.getGeneralEntity());
}
@Override
public SpecializationOf doAction(QualifiedSpecializationOf o) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(o,attrs);
convertLabelAttributes(o,attrs);
convertAttributes(o,attrs);
ModelConstructorExtension c2=(ModelConstructorExtension)c;
return c2.newQualifiedSpecializationOf(o.getId(), o.getSpecificEntity(), o.getGeneralEntity(), attrs);
}
@Override
public AlternateOf doAction(QualifiedAlternateOf o) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(o,attrs);
convertLabelAttributes(o,attrs);
convertAttributes(o,attrs);
ModelConstructorExtension c2=(ModelConstructorExtension)c;
return c2.newQualifiedAlternateOf(o.getId(), o.getAlternate1(), o.getAlternate2(), attrs);
}
@Override
public HadMember doAction(QualifiedHadMember o) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(o,attrs);
convertLabelAttributes(o,attrs);
convertAttributes(o,attrs);
ModelConstructorExtension c2=(ModelConstructorExtension)c;
List<QualifiedName> qq=new LinkedList<QualifiedName>();
if (o.getEntity()!=null) {
for (QualifiedName eid:o.getEntity()) {
qq.add(eid);
}
}
return c2.newQualifiedHadMember(o.getId(),o.getCollection(), qq,attrs);
}
public Used doAction(Used use) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(use,attrs);
convertLabelAttributes(use,attrs);
convertLocationAttributes(use,attrs);
convertRoleAttributes(use,attrs);
convertAttributes(use,attrs);
return c.newUsed(use.getId(), use.getActivity(), use.getEntity(), use.getTime(), attrs);
}
public WasAssociatedWith doAction(WasAssociatedWith assoc) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(assoc,attrs);
convertLabelAttributes(assoc,attrs);
convertRoleAttributes(assoc,attrs);
convertAttributes(assoc,attrs);
return c.newWasAssociatedWith(assoc.getId(),
assoc.getActivity(),
assoc.getAgent(),
assoc.getPlan(),
attrs);
}
public WasAttributedTo doAction(WasAttributedTo att) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(att,attrs);
convertLabelAttributes(att,attrs);
convertAttributes(att,attrs);
return c.newWasAttributedTo(att.getId(), att.getEntity(), att.getAgent(), attrs);
}
public WasDerivedFrom doAction(WasDerivedFrom deriv) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(deriv,attrs);
convertLabelAttributes(deriv,attrs);
convertAttributes(deriv,attrs);
return c.newWasDerivedFrom(deriv.getId(),
deriv.getGeneratedEntity(),
deriv.getUsedEntity(),
deriv.getActivity(),
deriv.getGeneration(),
deriv.getUsage(),
attrs);
}
public WasEndedBy doAction(WasEndedBy end) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(end,attrs);
convertLabelAttributes(end,attrs);
convertLocationAttributes(end,attrs);
convertRoleAttributes(end,attrs);
convertAttributes(end,attrs);
return c.newWasEndedBy(end.getId(), end.getActivity(), end.getTrigger(), end.getEnder(), end.getTime(), attrs);
}
public WasGeneratedBy doAction(WasGeneratedBy gen) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(gen,attrs);
convertLabelAttributes(gen,attrs);
convertLocationAttributes(gen,attrs);
convertRoleAttributes(gen,attrs);
convertAttributes(gen,attrs);
return c.newWasGeneratedBy(gen.getId(), gen.getEntity(), gen.getActivity(), gen.getTime(), attrs);
}
public WasInfluencedBy doAction(WasInfluencedBy infl) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(infl,attrs);
convertLabelAttributes(infl,attrs);
convertAttributes(infl,attrs);
return c.newWasInfluencedBy(infl.getId(), infl.getInfluencee(), infl.getInfluencer(), attrs);
}
public WasInformedBy doAction(WasInformedBy inf) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(inf,attrs);
convertLabelAttributes(inf,attrs);
convertAttributes(inf,attrs);
return c.newWasInformedBy(inf.getId(), inf.getInformed(), inf.getInformant(), attrs);
}
public WasInvalidatedBy doAction(WasInvalidatedBy inv) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(inv,attrs);
convertLabelAttributes(inv,attrs);
convertLocationAttributes(inv,attrs);
convertRoleAttributes(inv,attrs);
convertAttributes(inv,attrs);
return c.newWasInvalidatedBy(inv.getId(), inv.getEntity(), inv.getActivity(), inv.getTime(), attrs);
}
public WasStartedBy doAction(WasStartedBy start) {
List<Attribute> attrs=new LinkedList<Attribute>();
convertTypeAttributes(start,attrs);
convertLabelAttributes(start,attrs);
convertLocationAttributes(start,attrs);
convertRoleAttributes(start,attrs);
convertAttributes(start,attrs);
return c.newWasStartedBy(start.getId(), start.getActivity(), start.getTrigger(), start.getStarter(), start.getTime(), attrs);
}
@SuppressWarnings("unchecked")
public List<Attribute> convertAttributes(HasOther e, List<Attribute> acc) {
@SuppressWarnings("rawtypes")
List ll=e.getOther();
acc.addAll((List<Attribute>)ll);
return acc;
}
public List<Attribute> convertLabelAttributes(HasLabel e, List<Attribute> acc) {
List<LangString> labels = e.getLabel();
for (LangString label : labels) {
acc.add(pFactory.newAttribute(Attribute.AttributeKind.PROV_LABEL,label, pFactory.getName().XSD_STRING));
}
return acc;
}
public List<Attribute> convertLocationAttributes(HasLocation e, List<Attribute> acc) {
List<Location> locations = e.getLocation();
for (Location location : locations) {
acc.add(pFactory.newAttribute(Attribute.AttributeKind.PROV_LOCATION,
location.getValue(),
location.getType()));
}
return acc;
}
public List<Attribute> convertRoleAttributes(HasRole e, List<Attribute> acc) {
List<Role> roles = e.getRole();
for (Role role : roles) {
acc.add(pFactory.newAttribute(Attribute.AttributeKind.PROV_ROLE,
role.getValue(),
role.getType()));
}
return acc;
}
public List<Attribute> convertTypeAttributes(HasType e, List<Attribute> acc) {
List<Type> types=e.getType();
for (Type type : types) {
acc.add(pFactory.newAttribute(Attribute.AttributeKind.PROV_TYPE,
type.getValue(),
//type.getValueAsObject(vconv),
type.getType()));
}
return acc;
}
public Object convertValueAttributes(HasValue e, List<Attribute> acc) {
Value value = e.getValue();
if (value==null) return acc;
acc.add(pFactory.newAttribute(Attribute.AttributeKind.PROV_VALUE,
value.getValue(),
value.getType()));
return acc;
}
}