/*
* 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 gobblin.source.workunit;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
/**
* A class that wraps multiple {@link WorkUnit}s so they can executed within a single task.
*
* <p>
* This class also extends the {@link gobblin.configuration.State} object and thus it is possible to set and get
* properties from this class. The {@link #setProp(String, Object)} method will add the specified key, value pair to
* this class as well as to every {@link WorkUnit} in {@link #workUnits}. The {@link #getProp(String)} methods will
* only return properties that have been explicitily set in this class (e.g. it will not retrieve properties from
* {@link #workUnits}.
* </p>
*
* @author Yinan Li
*/
public class MultiWorkUnit extends WorkUnit {
private final List<WorkUnit> workUnits = Lists.newArrayList();
/**
* @deprecated Use {@link #createEmpty()} instead.
*/
@Deprecated
public MultiWorkUnit() {
super();
}
/**
* Get an immutable list of {@link WorkUnit}s wrapped by this {@link MultiWorkUnit}.
*
* @return immutable list of {@link WorkUnit}s wrapped by this {@link MultiWorkUnit}
*/
public List<WorkUnit> getWorkUnits() {
return ImmutableList.<WorkUnit>builder().addAll(this.workUnits).build();
}
/**
* Add a single {@link WorkUnit}.
*
* @param workUnit {@link WorkUnit} to add
*/
public void addWorkUnit(WorkUnit workUnit) {
this.workUnits.add(workUnit);
}
/**
* Add a collection of {@link WorkUnit}s.
*
* @param workUnits collection of {@link WorkUnit}s to add
*/
public void addWorkUnits(Collection<WorkUnit> workUnits) {
this.workUnits.addAll(workUnits);
}
/**
* Set the specified key, value pair in this {@link MultiWorkUnit} as well as in all the inner {@link WorkUnit}s.
*
* {@inheritDoc}
* @see gobblin.configuration.State#setProp(java.lang.String, java.lang.Object)
*/
@Override
public void setProp(String key, Object value) {
super.setProp(key, value);
for (WorkUnit workUnit : this.workUnits) {
workUnit.setProp(key, value);
}
}
/**
* Set the specified key, value pair in this {@link MultiWorkUnit} only, but do not propagate it to all the inner
* {@link WorkUnit}s.
*
* @param key property key
* @param value property value
*/
public void setPropExcludeInnerWorkUnits(String key, Object value) {
super.setProp(key, value);
}
@Override
public void readFields(DataInput in)
throws IOException {
int numWorkUnits = in.readInt();
for (int i = 0; i < numWorkUnits; i++) {
WorkUnit workUnit = WorkUnit.createEmpty();
workUnit.readFields(in);
this.workUnits.add(workUnit);
}
super.readFields(in);
}
@Override
public void write(DataOutput out)
throws IOException {
out.writeInt(this.workUnits.size());
for (WorkUnit workUnit : this.workUnits) {
workUnit.write(out);
}
super.write(out);
}
@Override
public boolean equals(Object object) {
if (!(object instanceof MultiWorkUnit)) {
return false;
}
MultiWorkUnit other = (MultiWorkUnit) object;
return super.equals(other) && this.workUnits.equals(other.workUnits);
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((this.workUnits == null) ? 0 : this.workUnits.hashCode());
return result;
}
/**
* Create a new empty {@link MultiWorkUnit} instance.
*
* @return a new empty {@link MultiWorkUnit} instance
*/
public static MultiWorkUnit createEmpty() {
return new MultiWorkUnit();
}
}