| /** |
| * 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); |
| } |
| } |
| |
| } |