/**
*
* Copyright (c) 2006-2017, Speedment, Inc. All Rights Reserved.
*
* Licensed 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 com.speedment.generator.standard.internal.util;
import com.speedment.common.codegen.model.Interface;
import com.speedment.common.injector.Injector;
import com.speedment.generator.standard.StandardTranslatorKey;
import com.speedment.generator.translator.JavaClassTranslator;
import com.speedment.generator.translator.component.CodeGenerationComponent;
import com.speedment.runtime.config.Column;
import com.speedment.runtime.config.ForeignKey;
import com.speedment.runtime.config.ForeignKeyColumn;
import com.speedment.runtime.config.Table;
import com.speedment.runtime.core.exception.SpeedmentException;
import static com.speedment.runtime.config.util.DocumentUtil.ancestor;
import static java.util.Objects.requireNonNull;
/**
*
* @author pemi
*/
public final class FkHolder {
private final CodeGenerationComponent codeGenerationComponent;
private final ForeignKey fk;
private final ForeignKeyColumn fkc;
private final Column column;
private final Table table;
private final Column foreignColumn;
private final Table foreignTable;
public FkHolder(Injector injector, ForeignKey fk) {
requireNonNull(fk);
this.codeGenerationComponent = injector.getOrThrow(CodeGenerationComponent.class);
this.fk = fk;
this.fkc = fk.foreignKeyColumns().findFirst().orElseThrow(this::noEnabledForeignKeyException);
this.column = fkc.findColumn().orElseThrow(this::couldNotFindLocalColumnException);
this.table = ancestor(column, Table.class).get();
this.foreignColumn = fkc.findForeignColumn().orElseThrow(this::foreignKeyWasNullException);
this.foreignTable = fkc.findForeignTable().orElseThrow(this::foreignKeyWasNullException);
}
public Column getColumn() {
return column;
}
public Table getTable() {
return table;
}
public Column getForeignColumn() {
return foreignColumn;
}
public Table getForeignTable() {
return foreignTable;
}
public JavaClassTranslator<Table, Interface> getEmt() {
@SuppressWarnings("unchecked")
final JavaClassTranslator<Table, Interface> translator =
(JavaClassTranslator<Table, Interface>)
codeGenerationComponent.findTranslator(getTable(), StandardTranslatorKey.MANAGER);
return translator;
}
public JavaClassTranslator<Table, Interface> getForeignEmt() {
@SuppressWarnings("unchecked")
final JavaClassTranslator<Table, Interface> translator =
(JavaClassTranslator<Table, Interface>)
codeGenerationComponent.findTranslator(getForeignTable(), StandardTranslatorKey.MANAGER);
return translator;
}
private IllegalStateException noEnabledForeignKeyException() {
return new IllegalStateException(
"FK " + fk.getId() + " does not have an enabled ForeignKeyColumn"
);
}
private SpeedmentException couldNotFindLocalColumnException() {
return new SpeedmentException(
"Could not find referenced local column '" +
fkc.getId() + "' in table '" +
fkc.getParent().flatMap(ForeignKey::getParent).get().getId() + "'."
);
}
private SpeedmentException foreignKeyWasNullException() {
return new SpeedmentException(
"Could not find referenced foreign column '" +
fkc.getForeignColumnName() + "' in table '" +
fkc.getForeignTableName() + "'."
);
}
}