001/*
002 * Copyright 2007-2018 The jdeb developers.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.vafer.jdeb.producers;
017
018import java.io.IOException;
019
020import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
021import org.vafer.jdeb.DataConsumer;
022import org.vafer.jdeb.DataProducer;
023import org.vafer.jdeb.mapping.Mapper;
024
025/**
026 * DataProducer representing a single file
027 * For cross-platform permissions and ownerships you probably want to use a Mapper, too.
028 */
029public final class DataProducerLink extends AbstractDataProducer implements DataProducer {
030
031    private final String path;
032    private final String linkName;
033    private final boolean symlink;
034
035    public DataProducerLink(final String path, final String linkName, final boolean symlink, String[] pIncludes, String[] pExcludes, Mapper[] pMapper) {
036        super(pIncludes, pExcludes, pMapper);
037        this.path = path;
038        this.symlink = symlink;
039        this.linkName = linkName;
040    }
041
042    public void produce( final DataConsumer pReceiver ) throws IOException {
043        TarArchiveEntry entry = new TarArchiveEntry(path, symlink ? TarArchiveEntry.LF_SYMLINK : TarArchiveEntry.LF_LINK);
044        entry.setLinkName(linkName);
045
046        entry.setUserId(Producers.ROOT_UID);
047        entry.setUserName(Producers.ROOT_NAME);
048        entry.setGroupId(Producers.ROOT_UID);
049        entry.setGroupName(Producers.ROOT_NAME);
050        entry.setMode(TarArchiveEntry.DEFAULT_FILE_MODE);
051
052        entry = map(entry);
053
054        entry.setName(path);
055        entry.setLinkName(linkName);
056
057        pReceiver.onEachLink(entry);
058    }
059
060}