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 = new Comparator<TiffElement>() {
025        @Override
026        public int compare(final TiffElement e1, final TiffElement e2) {
027            if (e1.offset < e2.offset) {
028                return -1;
029            } else if (e1.offset > e2.offset) {
030                return 1;
031            } else {
032                return 0;
033            }
034        }
035    };
036
037    public TiffElement(final long offset, final int length) {
038        this.offset = offset;
039        this.length = length;
040    }
041
042    public abstract String getElementDescription();
043
044    public abstract static class DataElement extends TiffElement {
045        private final byte[] data;
046
047        public DataElement(final long offset, final int length, final byte[] data) {
048            super(offset, length);
049
050            this.data = data;
051        }
052
053        public byte[] getData() {
054            return data;
055        }
056
057        public int getDataLength() {
058            return data.length;
059        }
060    }
061
062    public static final class Stub extends TiffElement {
063        public Stub(final long offset, final int length) {
064            super(offset, length);
065        }
066
067        @Override
068        public String getElementDescription() {
069            return "Element, offset: " + offset + ", length: " + length
070                    + ", last: " + (offset + length);
071        }
072
073    }
074}