001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.commons.imaging.formats.tiff;
018
019import java.util.Comparator;
020
021public abstract class TiffElement {
022    public final long offset;
023    public final int length;
024    public static final Comparator<TiffElement> COMPARATOR = (e1, e2) -> {
025        if (e1.offset < e2.offset) {
026            return -1;
027        } else if (e1.offset > e2.offset) {
028            return 1;
029        } else {
030            return 0;
031        }
032    };
033
034    public TiffElement(final long offset, final int length) {
035        this.offset = offset;
036        this.length = length;
037    }
038
039    public abstract String getElementDescription();
040
041    public abstract static class DataElement extends TiffElement {
042        private final byte[] data;
043
044        public DataElement(final long offset, final int length, final byte[] data) {
045            super(offset, length);
046
047            this.data = data;
048        }
049
050        public byte[] getData() {
051            return data.clone();
052        }
053
054        public int getDataLength() {
055            return data.length;
056        }
057    }
058
059    public static final class Stub extends TiffElement {
060        public Stub(final long offset, final int length) {
061            super(offset, length);
062        }
063
064        @Override
065        public String getElementDescription() {
066            return "Element, offset: " + offset + ", length: " + length
067                    + ", last: " + (offset + length);
068        }
069
070    }
071}