blob: 4d933d6cf47764ea6026153d301f1c39f9fa2de2 [file] [log] [blame]
/********************************************************************************
* Copyright (c) 2015-2020 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
********************************************************************************/
package org.eclipse.mdm.apicopy.control;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.commons.lang3.ArrayUtils;
import org.eclipse.mdm.api.base.ServiceNotProvidedException;
import org.eclipse.mdm.api.base.Transaction;
import org.eclipse.mdm.api.base.adapter.ModelManager;
import org.eclipse.mdm.api.base.file.FileService;
import org.eclipse.mdm.api.base.massdata.AnyTypeValuesBuilder;
import org.eclipse.mdm.api.base.massdata.ComplexNumericalValuesBuilder;
import org.eclipse.mdm.api.base.massdata.ExternalComponent;
import org.eclipse.mdm.api.base.massdata.NumericalValuesBuilder;
import org.eclipse.mdm.api.base.massdata.WriteRequest;
import org.eclipse.mdm.api.base.massdata.WriteRequestBuilder;
import org.eclipse.mdm.api.base.model.Channel;
import org.eclipse.mdm.api.base.model.ChannelGroup;
import org.eclipse.mdm.api.base.model.DoubleComplex;
import org.eclipse.mdm.api.base.model.Entity;
import org.eclipse.mdm.api.base.model.FileLink;
import org.eclipse.mdm.api.base.model.FloatComplex;
import org.eclipse.mdm.api.base.model.MeasuredValues;
import org.eclipse.mdm.api.base.model.MeasuredValues.ValueIterator;
import org.eclipse.mdm.api.base.model.Measurement;
import org.eclipse.mdm.api.base.model.Quantity;
import org.eclipse.mdm.api.base.model.ScalarType;
import org.eclipse.mdm.api.base.model.SequenceRepresentation;
import org.eclipse.mdm.api.base.model.Test;
import org.eclipse.mdm.api.base.model.TestStep;
import org.eclipse.mdm.api.base.model.Unit;
import org.eclipse.mdm.api.base.model.Value;
import org.eclipse.mdm.api.base.model.ValueType;
import org.eclipse.mdm.api.base.query.Filter;
import org.eclipse.mdm.api.base.search.SearchService;
import org.eclipse.mdm.api.dflt.ApplicationContext;
import org.eclipse.mdm.api.dflt.EntityManager;
import org.eclipse.mdm.api.dflt.model.EntityFactory;
import org.eclipse.mdm.api.dflt.model.Pool;
import org.eclipse.mdm.api.dflt.model.Project;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Strings;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.io.Files;
public abstract class TransferBase {
private static final Logger LOG = LoggerFactory.getLogger(TransferBase.class);
List<Class<? extends Entity>> supportedRootEntities = Arrays.asList(Project.class, Pool.class, Test.class,
TestStep.class, Measurement.class);
ApplicationContext contextSrc;
EntityManager entityManagerSrc;
ApplicationContext contextDst;
EntityManager entityManagerDst;
EntityFactory entityFactoryDst;
ModelManager modelManagerDst;
FileService fileServiceDst;
FileService fileServiceSrc;
Map<EntityHolder, EntityHolder> mapSrcDstEntities = new HashMap<>();
Multimap<Entity, FileLink> mapFileLinksReplaced = ArrayListMultimap.create();
Multimap<Entity, FileLink> mapFileLinksUploaded = ArrayListMultimap.create();
List<File> listFilesDownloadedToTempDir = new ArrayList<>();
Map<String, FileLink> mapFileLinksExtComp = new HashMap<>();
public TransferBase(ApplicationContext src, ApplicationContext dst) {
contextSrc = src;
entityManagerSrc = contextSrc.getEntityManager()
.orElseThrow(() -> new ServiceNotProvidedException(EntityManager.class));
contextDst = dst;
entityManagerDst = contextDst.getEntityManager()
.orElseThrow(() -> new ServiceNotProvidedException(EntityManager.class));
entityFactoryDst = contextDst.getEntityFactory()
.orElseThrow(() -> new ServiceNotProvidedException(EntityFactory.class));
modelManagerDst = contextDst.getModelManager()
.orElseThrow(() -> new ServiceNotProvidedException(ModelManager.class));
if (contextDst.getFileService().isPresent()) {
fileServiceDst = contextDst.getFileService().get();
}
if (contextSrc.getFileService().isPresent()) {
fileServiceSrc = contextSrc.getFileService().get();
}
}
ListMultimap<Class<? extends Entity>, Entity> loadParents(List<? extends Entity> entities) {
List<Entity> list = entities.stream().filter(e -> !isSupported(e)).collect(Collectors.toList());
if (!list.isEmpty()) {
throw new ApiCopyException("Entity " + list + " not supported!");
}
LinkedListMultimap<Class<? extends Entity>, Entity> byType = LinkedListMultimap.create();
entities.forEach(e -> byType.put(e.getClass(), e));
byType.get(Measurement.class)
.forEach(e -> byType.put(TestStep.class, entityManagerSrc.loadParent(e, TestStep.class).get()));
byType.get(TestStep.class)
.forEach(e -> byType.put(Test.class, entityManagerSrc.loadParent(e, Test.class).get()));
byType.get(Test.class).forEach(e -> byType.put(Pool.class, entityManagerSrc.loadParent(e, Pool.class).get()));
byType.get(Pool.class)
.forEach(e -> byType.put(Project.class, entityManagerSrc.loadParent(e, Project.class).get()));
entities.forEach(e -> byType.remove(e.getClass(), e));
return byType;
}
boolean isSupported(Entity e) {
return supportedRootEntities.contains(e.getClass());
}
<T extends Entity> Optional<T> fetchOne(SearchService searchService, Class<T> entityClass, Filter filter) {
List<T> results = searchService.fetch(entityClass, filter);
if (results.isEmpty()) {
return Optional.empty();
} else if (results.size() == 1) {
return Optional.of(results.get(0));
} else {
throw new IllegalStateException(String.format("Expected at most one instance of %s, but found %s!",
entityClass.getName(), results.size()));
}
}
<T extends Entity> Optional<T> fetchOne(EntityManager entityManager, Class<T> entityClass, String name) {
final List<T> results = entityManager.loadAll(entityClass, name);
if (results.isEmpty()) {
return Optional.empty();
} else if (results.size() == 1) {
return Optional.of(results.get(0));
} else {
throw new IllegalStateException(String.format("Expected at most one instance of %s, but found %s!",
entityClass.getName(), results.size()));
}
}
<T extends Entity> Optional<T> fetchChild(EntityManager entityManager, Entity parent, Class<T> childEntityClass,
String name) {
List<T> results = entityManagerDst.loadChildren(parent, childEntityClass, name);
if (results.isEmpty()) {
return Optional.empty();
} else if (results.size() == 1) {
return Optional.of(results.get(0));
} else {
throw new IllegalStateException(String.format("Expected at most one instance of %s, but found %s!",
childEntityClass.getName(), results.size()));
}
}
boolean isNewEntity(Entity entity) {
return (Strings.isNullOrEmpty(entity.getID()) || Long.valueOf(entity.getID()) <= 0);
}
void persist(Transaction transaction, Entity entity) {
if (isNewEntity(entity)) {
transaction.create(Lists.newArrayList(entity));
} else {
transaction.update(Lists.newArrayList(entity));
}
}
void persist(Transaction transaction, List<? extends Entity> entities) {
List<Entity> newEntities = new ArrayList<>();
List<Entity> updateEntities = new ArrayList<>();
for (Entity entity : entities) {
if (isNewEntity(entity)) {
newEntities.add(entity);
} else {
updateEntities.add(entity);
}
}
transaction.create(newEntities);
transaction.update(updateEntities);
}
Channel copyChannel(Channel channelSrc, Measurement measurementParentDst, List<Channel> existingChannels,
Map<String, Optional<Quantity>> quantitiesByName, Transaction transaction) {
EntityHolder ehSrc = new EntityHolder(channelSrc, entityManagerSrc);
EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
if (null == ehDst) {
LOG.trace("Copying Channel '{}'", channelSrc.getName());
Quantity quantity = quantitiesByName.getOrDefault(channelSrc.getQuantity().getName(), Optional.empty())
.orElseThrow(() -> new ApiCopyException(
String.format("Cannot find Quantity with name '%s' in destination!",
channelSrc.getQuantity().getName())));
Channel channelDst = existingChannels.stream().filter(c -> c.getName().equals(channelSrc.getName()))
.findAny().orElseGet(
() -> entityFactoryDst.createChannel(channelSrc.getName(), measurementParentDst, quantity));
copyValues(channelSrc, channelDst, Arrays.asList("Id"), false); // initially ignored in export:
// "Name"
persist(transaction, channelDst);
ehDst = new EntityHolder(channelDst, entityManagerDst);
mapSrcDstEntities.put(ehSrc, ehDst);
}
return (Channel) ehDst.getEntity();
}
void copyValues(Entity srcEntity, Entity dstEntity, List<String> ignoredAttributes) {
copyValues(srcEntity, dstEntity, ignoredAttributes, false);
}
void copyValues(Entity srcEntity, Entity dstEntity, List<String> ignoredAttributes, boolean onlyValid) {
Set<String> valueNamesDst = dstEntity.getValues().keySet();
for (Map.Entry<String, Value> me : srcEntity.getValues().entrySet()) {
String key = me.getKey();
if (!ignoredAttributes.contains(key) && valueNamesDst.contains(key)) {
Value valueSrc = me.getValue();
if (onlyValid && !valueSrc.isValid()) {
continue;
}
Value value = dstEntity.getValue(me.getKey());
if (isFileLinkDataType(valueSrc.getValueType())) {
collectReplacedFileLinks(dstEntity, value, isReplaceFileLinks());
if (valueSrc.isValid()) {
uploadFiles(srcEntity, dstEntity, valueSrc);
}
if (ValueType.FILE_LINK_SEQUENCE.equals(valueSrc.getValueType()) && !isReplaceFileLinks()) {
FileLink[] existingFileLinks = value.extract(ValueType.FILE_LINK_SEQUENCE);
FileLink[] newFileLinks = valueSrc.extract(ValueType.FILE_LINK_SEQUENCE);
valueSrc.set(ArrayUtils.addAll(existingFileLinks, newFileLinks));
}
}
try {
value.set(valueSrc.extract());
} catch (IllegalArgumentException e) {
throw new ApiCopyException(
"Cannot set value for " + dstEntity.getName() + "." + me.getKey() + ": " + e.getMessage(),
e);
}
value.setValid(valueSrc.isValid());
}
}
}
private void collectReplacedFileLinks(Entity dstEntity, Value value, boolean replaceFileLinks) {
if (ValueType.FILE_LINK.equals(value.getValueType()) && value.isValid()) {
FileLink fileToDelete = value.extract();
mapFileLinksReplaced.put(dstEntity, fileToDelete);
} else if (ValueType.FILE_LINK_SEQUENCE.equals(value.getValueType()) && replaceFileLinks) {
FileLink[] fileLinksToDelete = value.extract();
mapFileLinksReplaced.putAll(dstEntity, Arrays.asList(fileLinksToDelete));
}
}
/**
*
* @param valueType
* @return
*/
private boolean isFileLinkDataType(ValueType<?> valueType) {
boolean isFileDataType = false;
if (ValueType.FILE_LINK_SEQUENCE.equals(valueType) || ValueType.FILE_LINK.equals(valueType)) {
isFileDataType = true;
}
return isFileDataType;
}
/**
* Uploading file of srcEntity and set the filelink to the dstEntity. Collect
* additionally the uploaded FileLinks in a map
*
* @param srcEntity
* @param dstEntity
* @param valueSrc
*/
private void uploadFiles(Entity srcEntity, Entity dstEntity, Value valueSrc) {
try {
if (fileServiceSrc != null && fileServiceDst != null) {
if (ValueType.FILE_LINK_SEQUENCE.equals(valueSrc.getValueType())) {
List<FileLink> fileLinkList = downloadSourceFiles(srcEntity,
Arrays.asList(valueSrc.extract(ValueType.FILE_LINK_SEQUENCE)));
fileServiceDst.uploadSequential(dstEntity, fileLinkList, null);
valueSrc.set(fileLinkList.toArray(new FileLink[fileLinkList.size()]));
mapFileLinksUploaded.putAll(dstEntity, fileLinkList);
} else if (ValueType.FILE_LINK.equals(valueSrc.getValueType())) {
FileLink fileLink = downloadSourceFile(srcEntity, valueSrc.extract(ValueType.FILE_LINK));
fileServiceDst.uploadSequential(dstEntity, Collections.singletonList(fileLink), null);
valueSrc.set(fileLink);
mapFileLinksUploaded.put(dstEntity, fileLink);
}
}
} catch (IOException e) {
throw new ApiCopyException(e.getLocalizedMessage(), e);
}
}
private List<FileLink> downloadSourceFiles(Entity srcEntity, List<FileLink> fileLinkList) throws IOException {
List<FileLink> returnList = new ArrayList<FileLink>();
for (FileLink fileLink : fileLinkList) {
returnList.add(downloadSourceFile(srcEntity, fileLink));
}
return returnList;
}
private FileLink downloadSourceFile(Entity srcEntity, FileLink fileLinkSrc) throws IOException {
Path targetPath = Files.createTempDir().toPath();
Path filePathAbsolute = targetPath.resolve(fileLinkSrc.getFileName());
fileServiceSrc.download(srcEntity, targetPath, fileLinkSrc);
listFilesDownloadedToTempDir.add(filePathAbsolute.toFile());
return FileLink.newLocal(filePathAbsolute);
}
WriteRequest createWriteRequest(ChannelGroup channelGroupDst, Channel channelDst, MeasuredValues measuredValues,
Unit sourceUnit) {
WriteRequestBuilder wrb = WriteRequest.create(channelGroupDst, channelDst, measuredValues.getAxisType());
NumericalValuesBuilder builder = null;
SequenceRepresentation seqRep = measuredValues.getSequenceRepresentation();
ScalarType scalarType = measuredValues.getScalarType();
boolean independent = measuredValues.isIndependent();
double[] generationParameters = measuredValues.getGenerationParameters();
if (seqRep.isExternal() && measuredValues.hasExternalComponents()) {
try {
List<FileLink> listFileLinksNew = new ArrayList<>();
for (ExternalComponent extComp : measuredValues.getExternalComponents()) {
FileLink fileLink = extComp.getFileLink();
if (fileLink != null) {
FileLink fileLinkNew = mapFileLinksExtComp.get(fileLink.getRemotePath());
if (fileLinkNew == null) {
fileLinkNew = downloadSourceFile(sourceUnit, fileLink);
mapFileLinksExtComp.put(fileLink.getRemotePath(), fileLinkNew);
listFileLinksNew.add(fileLinkNew);
}
extComp.setFileLink(fileLinkNew);
}
FileLink flagsFileLink = extComp.getFlagsFileLink();
if (flagsFileLink != null) {
FileLink flagsFileLinkNew = mapFileLinksExtComp.get(flagsFileLink.getRemotePath());
if (flagsFileLinkNew == null) {
flagsFileLinkNew = downloadSourceFile(sourceUnit, flagsFileLink);
mapFileLinksExtComp.put(flagsFileLink.getRemotePath(), flagsFileLinkNew);
listFileLinksNew.add(flagsFileLinkNew);
}
extComp.setFlagsFileLink(flagsFileLinkNew);
}
}
if (fileServiceSrc != null && fileServiceDst != null && !listFileLinksNew.isEmpty()) {
fileServiceDst.uploadSequential(channelDst, listFileLinksNew, null);
mapFileLinksUploaded.putAll(channelDst, listFileLinksNew);
}
} catch (IOException e) {
throw new ApiCopyException(e.getLocalizedMessage(), e);
}
}
if (SequenceRepresentation.EXPLICIT.equals(seqRep)) {
builder = wrb.explicit();
} else if (SequenceRepresentation.EXPLICIT_EXTERNAL.equals(seqRep)) {
return wrb.explicitExternal().externalComponents(scalarType, measuredValues.getExternalComponents())
.independent(independent).build();
} else if (SequenceRepresentation.IMPLICIT_CONSTANT.equals(seqRep)) {
checkGenerationParameters(generationParameters, 1);
return wrb.implicitConstant(scalarType, generationParameters[0]).build();
} else if (SequenceRepresentation.IMPLICIT_LINEAR.equals(seqRep)) {
checkGenerationParameters(generationParameters, 2);
return wrb.implicitLinear(scalarType, generationParameters[0], generationParameters[1])
.independent(independent).build();
} else if (SequenceRepresentation.IMPLICIT_SAW.equals(seqRep)) {
checkGenerationParameters(generationParameters, 3);
return wrb
.implicitSaw(scalarType, generationParameters[0], generationParameters[1], generationParameters[2])
.build();
} else if (SequenceRepresentation.RAW_LINEAR.equals(seqRep)) {
checkGenerationParameters(generationParameters, 2);
builder = wrb.rawLinear(generationParameters[0], generationParameters[1]);
} else if (SequenceRepresentation.RAW_LINEAR_EXTERNAL.equals(seqRep)) {
checkGenerationParameters(generationParameters, 2);
return wrb.rawLinearExternal(generationParameters[0], generationParameters[1])
.externalComponents(scalarType, measuredValues.getExternalComponents()).independent(independent)
.build();
} else if (SequenceRepresentation.RAW_LINEAR_CALIBRATED.equals(seqRep)) {
checkGenerationParameters(generationParameters, 3);
builder = wrb.rawLinearCalibrated(generationParameters[0], generationParameters[1],
generationParameters[2]);
} else if (SequenceRepresentation.RAW_LINEAR_CALIBRATED_EXTERNAL.equals(seqRep)) {
checkGenerationParameters(generationParameters, 3);
return wrb
.rawLinearCalibratedExternal(generationParameters[0], generationParameters[1],
generationParameters[2])
.externalComponents(scalarType, measuredValues.getExternalComponents()).independent(independent)
.build();
} else if (SequenceRepresentation.RAW_POLYNOMIAL.equals(seqRep)) {
builder = wrb.rawPolynomial(generationParameters);
} else if (SequenceRepresentation.RAW_POLYNOMIAL_EXTERNAL.equals(seqRep)) {
return wrb.rawPolynomialExternal(generationParameters)
.externalComponents(scalarType, measuredValues.getExternalComponents()).independent(independent)
.build();
}
if (scalarType.isString()) {
String[] values = new String[measuredValues.getLength()];
boolean[] flags = new boolean[values.length];
ValueIterator<String> iter = measuredValues.iterator();
int count = 0;
while (iter.hasNext()) {
flags[count] = iter.isValid();
values[count++] = iter.next();
}
return castBuilder(builder, AnyTypeValuesBuilder.class).stringValues(values, flags).build();
} else if (scalarType.isDate()) {
LocalDateTime[] values = new LocalDateTime[measuredValues.getLength()];
boolean[] flags = new boolean[values.length];
ValueIterator<LocalDateTime> iter = measuredValues.iterator();
int count = 0;
while (iter.hasNext()) {
flags[count] = iter.isValid();
values[count++] = iter.next();
}
return castBuilder(builder, AnyTypeValuesBuilder.class).dateValues(values, flags).independent(independent)
.build();
} else if (scalarType.isBoolean()) {
boolean[] values = new boolean[measuredValues.getLength()];
boolean[] flags = new boolean[values.length];
ValueIterator<Boolean> iter = measuredValues.iterator();
int count = 0;
while (iter.hasNext()) {
flags[count] = iter.isValid();
values[count++] = iter.next();
}
return castBuilder(builder, AnyTypeValuesBuilder.class).booleanValues(values, flags).build();
} else if (scalarType.isByte()) {
byte[] values = new byte[measuredValues.getLength()];
boolean[] flags = new boolean[values.length];
ValueIterator<Byte> iter = measuredValues.iterator();
int count = 0;
while (iter.hasNext()) {
flags[count] = iter.isValid();
values[count++] = iter.next();
}
return builder.byteValues(values, flags).independent(independent).build();
} else if (scalarType.isShort()) {
short[] values = new short[measuredValues.getLength()];
boolean[] flags = new boolean[values.length];
ValueIterator<Short> iter = measuredValues.iterator();
int count = 0;
while (iter.hasNext()) {
flags[count] = iter.isValid();
values[count++] = iter.next();
}
return builder.shortValues(values, flags).sourceUnit(sourceUnit).independent(independent).build();
} else if (scalarType.isInteger()) {
int[] values = new int[measuredValues.getLength()];
boolean[] flags = new boolean[values.length];
ValueIterator<Integer> iter = measuredValues.iterator();
int count = 0;
while (iter.hasNext()) {
flags[count] = iter.isValid();
values[count++] = iter.next();
}
return builder.integerValues(values, flags).sourceUnit(sourceUnit).independent(independent).build();
} else if (scalarType.isLong()) {
long[] values = new long[measuredValues.getLength()];
boolean[] flags = new boolean[values.length];
ValueIterator<Long> iter = measuredValues.iterator();
int count = 0;
while (iter.hasNext()) {
flags[count] = iter.isValid();
values[count++] = iter.next();
}
return builder.longValues(values, flags).sourceUnit(sourceUnit).independent(independent).build();
} else if (scalarType.isFloat()) {
float[] values = new float[measuredValues.getLength()];
boolean[] flags = new boolean[values.length];
ValueIterator<Float> iter = measuredValues.iterator();
int count = 0;
while (iter.hasNext()) {
flags[count] = iter.isValid();
values[count++] = iter.next();
}
return builder.floatValues(values, flags).sourceUnit(sourceUnit).independent(independent).build();
} else if (scalarType.isDouble()) {
double[] values = new double[measuredValues.getLength()];
boolean[] flags = new boolean[values.length];
ValueIterator<Double> iter = measuredValues.iterator();
int count = 0;
while (iter.hasNext()) {
flags[count] = iter.isValid();
values[count++] = iter.next();
}
return builder.doubleValues(values, flags).sourceUnit(sourceUnit).independent(independent).build();
} else if (scalarType.isByteStream()) {
byte[][] values = new byte[measuredValues.getLength()][];
boolean[] flags = new boolean[values.length];
ValueIterator<byte[]> iter = measuredValues.iterator();
int count = 0;
while (iter.hasNext()) {
flags[count] = iter.isValid();
values[count++] = iter.next();
}
return castBuilder(builder, AnyTypeValuesBuilder.class).byteStreamValues(values, flags).build();
} else if (scalarType.isFloatComplex()) {
FloatComplex[] values = new FloatComplex[measuredValues.getLength()];
boolean[] flags = new boolean[values.length];
ValueIterator<FloatComplex> iter = measuredValues.iterator();
int count = 0;
while (iter.hasNext()) {
flags[count] = iter.isValid();
values[count++] = iter.next();
}
return castBuilder(builder, ComplexNumericalValuesBuilder.class).floatComplexValues(values, flags)
.sourceUnit(sourceUnit).build();
} else if (scalarType.isDoubleComplex()) {
DoubleComplex[] values = new DoubleComplex[measuredValues.getLength()];
boolean[] flags = new boolean[values.length];
ValueIterator<DoubleComplex> iter = measuredValues.iterator();
int count = 0;
while (iter.hasNext()) {
flags[count] = iter.isValid();
values[count++] = iter.next();
}
return castBuilder(builder, ComplexNumericalValuesBuilder.class).doubleComplexValues(values, flags)
.sourceUnit(sourceUnit).build();
} else if (scalarType.isFileLink()) {
FileLink[] values = new FileLink[measuredValues.getLength()];
boolean[] flags = new boolean[values.length];
ValueIterator<FileLink> iter = measuredValues.iterator();
int count = 0;
while (iter.hasNext()) {
flags[count] = iter.isValid();
values[count++] = iter.next();
}
return castBuilder(builder, AnyTypeValuesBuilder.class).fileLinkValues(values, flags).build();
} else if (scalarType.isBlob()) {
Object value = null;
ValueIterator<Object> iter = measuredValues.iterator();
while (iter.hasNext()) {
value = iter.next();
}
return castBuilder(builder, AnyTypeValuesBuilder.class).blobValue(value).build();
} else {
throw new IllegalStateException(
String.format("Unsupported ScalarType %s in MeasuredValues!", scalarType.name()));
}
}
void checkGenerationParameters(double[] generationParameters, int expectedLength) {
if (null == generationParameters || generationParameters.length < expectedLength) {
throw new IllegalStateException(String.format("Number of generation parameters is %d, expected %d!",
(null == generationParameters ? 0 : generationParameters.length), expectedLength));
}
}
<T extends NumericalValuesBuilder> T castBuilder(NumericalValuesBuilder builder, Class<T> cls) {
if (!builder.getClass().isAssignableFrom(cls)) {
throw new IllegalStateException(String.format(
"Error creating the write values builder, expected class is %s, actual class is %s (likely column data type and sequence representation mismatch)!",
cls.getName(), (null == builder ? "???" : builder.getClass().getName())));
}
return cls.cast(builder);
}
/**
* Delete all replaced file links
*/
void deleteFilesOfReplacedFileLinks() {
mapFileLinksReplaced.asMap().forEach((entity, fileLinkList) -> {
fileServiceDst.delete(entity, fileLinkList);
});
}
void clearReplacedFileLinkCache() {
mapFileLinksReplaced.clear();
}
/**
* Delete all uploaded files, is necessary if the Import will be canceled
*/
void deleteFilesOfUploadedFileLinks() {
mapFileLinksUploaded.asMap().forEach((entity, fileLinkList) -> {
fileServiceDst.delete(entity, fileLinkList);
});
}
void deleteLocalTempFiles() {
listFilesDownloadedToTempDir.forEach(file -> deleteFileAndEmptyParentFolder(file));
}
void clearUploadedFileLinkCache() {
mapFileLinksUploaded.clear();
}
void deleteFileAndEmptyParentFolder(File file) {
file.delete();
Path dir = Paths.get(file.getAbsolutePath()).getParent();
if (dir != null && dir.toFile().list().length == 0) {
dir.toFile().delete();
}
}
public boolean isReplaceFileLinks() {
return false;
}
}