blob: a2b3db29af5b683d9c3b31a8759a4d0e07551782 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.atlas.typesystem.types;
import org.apache.atlas.AtlasException;
import org.apache.atlas.typesystem.IReferenceableInstance;
import org.apache.atlas.typesystem.IStruct;
import org.apache.atlas.typesystem.persistence.Id;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class FieldMapping {
public final Map<String, AttributeInfo> fields;
public final Map<String, Integer> fieldPos;
public final Map<String, Integer> fieldNullPos;
public final int numBools;
public final int numBytes;
public final int numShorts;
public final int numInts;
public final int numLongs;
public final int numFloats;
public final int numDoubles;
public final int numBigInts;
public final int numBigDecimals;
public final int numDates;
public final int numStrings;
public final int numArrays;
public final int numMaps;
public final int numStructs;
public final int numReferenceables;
public FieldMapping(Map<String, AttributeInfo> fields, Map<String, Integer> fieldPos,
Map<String, Integer> fieldNullPos, int numBools, int numBytes, int numShorts, int numInts, int numLongs,
int numFloats, int numDoubles, int numBigInts, int numBigDecimals, int numDates, int numStrings,
int numArrays, int numMaps, int numStructs, int numReferenceables) {
this.fields = fields;
this.fieldPos = fieldPos;
this.fieldNullPos = fieldNullPos;
this.numBools = numBools;
this.numBytes = numBytes;
this.numShorts = numShorts;
this.numInts = numInts;
this.numLongs = numLongs;
this.numFloats = numFloats;
this.numDoubles = numDoubles;
this.numBigInts = numBigInts;
this.numBigDecimals = numBigDecimals;
this.numDates = numDates;
this.numStrings = numStrings;
this.numArrays = numArrays;
this.numMaps = numMaps;
this.numStructs = numStructs;
this.numReferenceables = numReferenceables;
}
protected void outputFields(IStruct s, Appendable buf, String fieldPrefix, Set<? extends IStruct> inProcess) throws AtlasException {
for (Map.Entry<String, AttributeInfo> e : fields.entrySet()) {
String attrName = e.getKey();
AttributeInfo i = e.getValue();
Object aVal = s.get(attrName);
TypeUtils.outputVal(attrName + " : ", buf, fieldPrefix);
if (aVal != null && aVal instanceof Id) {
TypeUtils.outputVal(aVal.toString(), buf, "");
} else {
i.dataType().output(aVal, buf, fieldPrefix, inProcess);
}
TypeUtils.outputVal("\n", buf, "");
}
}
public void output(IStruct s, Appendable buf, String prefix, Set<IStruct> inProcess) throws AtlasException {
if (s == null) {
TypeUtils.outputVal("<null>\n", buf, "");
return;
}
if (inProcess == null) {
inProcess = new HashSet<>();
}
else if (inProcess.contains(s)) {
// Avoid infinite recursion when structs reference each other.
return;
}
inProcess.add(s);
try {
TypeUtils.outputVal("{", buf, prefix);
TypeUtils.outputVal("\n", buf, "");
String fieldPrefix = prefix + "\t";
outputFields(s, buf, fieldPrefix, inProcess);
TypeUtils.outputVal("}", buf, prefix);
}
finally {
inProcess.remove(s);
}
}
public void output(IReferenceableInstance s, Appendable buf, String prefix, Set<IReferenceableInstance> inProcess) throws AtlasException {
if (s == null) {
TypeUtils.outputVal("<null>\n", buf, "");
return;
}
if (inProcess == null) {
inProcess = new HashSet<>();
}
else if (inProcess.contains(s)) {
// Avoid infinite recursion when structs reference each other.
return;
}
inProcess.add(s);
try {
TypeUtils.outputVal("{", buf, prefix);
TypeUtils.outputVal("\n", buf, "");
String fieldPrefix = prefix + "\t";
TypeUtils.outputVal("id : ", buf, fieldPrefix);
TypeUtils.outputVal(s.getId().toString(), buf, "");
TypeUtils.outputVal("\n", buf, "");
outputFields(s, buf, fieldPrefix, inProcess);
TypeSystem ts = TypeSystem.getInstance();
for (String sT : s.getTraits()) {
TraitType tt = ts.getDataType(TraitType.class, sT);
TypeUtils.outputVal(sT + " : ", buf, fieldPrefix);
tt.output(s.getTrait(sT), buf, fieldPrefix, null);
}
TypeUtils.outputVal("}", buf, prefix);
}
finally {
inProcess.remove(s);
}
}
}