/* * 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.nifi.processors.evtx.parser.bxml; import org.apache.nifi.processors.evtx.parser.BinaryReader; import org.apache.nifi.processors.evtx.parser.BxmlNodeVisitor; import org.apache.nifi.processors.evtx.parser.ChunkHeader; import org.apache.nifi.processors.evtx.parser.bxml.value.BXmlTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.BinaryTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.BooleanTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.DoubleTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.FiletimeTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.FloatTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.GuidTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.Hex32TypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.Hex64TypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.NullTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.SIDTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.SignedByteTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.SignedDWordTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.SignedQWordTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.SignedWordTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.SizeTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.StringTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.SystemtimeTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.UnsignedByteTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.UnsignedDWordTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.UnsignedQWordTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.UnsignedWordTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.VariantTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.VariantTypeNodeFactory; import org.apache.nifi.processors.evtx.parser.bxml.value.WStringArrayTypeNode; import org.apache.nifi.processors.evtx.parser.bxml.value.WStringTypeNode; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Node type that has one VariantTypeNode child */ public class ValueNode extends BxmlNodeWithToken { public static final Map<Integer, VariantTypeNodeFactory> factories = initFactories(); private final int type; public ValueNode(BinaryReader binaryReader, ChunkHeader chunkHeader, BxmlNode parent) throws IOException { super(binaryReader, chunkHeader, parent); if ((getFlags() & 0x0B) != 0) { throw new IOException("Invalid flag"); } type = binaryReader.read(); init(); } private static final Map<Integer, VariantTypeNodeFactory> initFactories() { Map<Integer, VariantTypeNodeFactory> result = new HashMap<>(); result.put(0, NullTypeNode::new); result.put(1, WStringTypeNode::new); result.put(2, StringTypeNode::new); result.put(3, SignedByteTypeNode::new); result.put(4, UnsignedByteTypeNode::new); result.put(5, SignedWordTypeNode::new); result.put(6, UnsignedWordTypeNode::new); result.put(7, SignedDWordTypeNode::new); result.put(8, UnsignedDWordTypeNode::new); result.put(9, SignedQWordTypeNode::new); result.put(10, UnsignedQWordTypeNode::new); result.put(11, FloatTypeNode::new); result.put(12, DoubleTypeNode::new); result.put(13, BooleanTypeNode::new); result.put(14, BinaryTypeNode::new); result.put(15, GuidTypeNode::new); result.put(16, SizeTypeNode::new); result.put(17, FiletimeTypeNode::new); result.put(18, SystemtimeTypeNode::new); result.put(19, SIDTypeNode::new); result.put(20, Hex32TypeNode::new); result.put(21, Hex64TypeNode::new); result.put(33, BXmlTypeNode::new); result.put(129, WStringArrayTypeNode::new); return Collections.unmodifiableMap(result); } @Override protected List<BxmlNode> initChildren() throws IOException { VariantTypeNode variantTypeNode = factories.get(type).create(getBinaryReader(), getChunkHeader(), this, -1); return Collections.singletonList(variantTypeNode); } @Override public void accept(BxmlNodeVisitor bxmlNodeVisitor) throws IOException { bxmlNodeVisitor.visit(this); } }