org.opensingular.lib.wicket.util.model.IMappingModel Maven / Gradle / Ivy
/*
* Copyright (C) 2016 Singular Studios (a.k.a Atom Tecnologia) - www.opensingular.com
*
* 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 org.opensingular.lib.wicket.util.model;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.IWrapModel;
import org.opensingular.lib.commons.lambda.IBiConsumer;
import org.opensingular.lib.commons.lambda.IFunction;
import org.opensingular.lib.commons.lambda.IPredicate;
public interface IMappingModel extends IReadOnlyModel {
@SuppressWarnings("unchecked")
public static & IWrapModel> M of(IModel model) {
class WrapperMappingModel implements IMappingModel, IWrapModel {
@Override
public void detach() {
model.detach();
}
@Override
public T getObject() {
return model.getObject();
}
@Override
public void setObject(T object) {
model.setObject(object);
}
@Override
public IModel getWrappedModel() {
return model;
}
}
return (M) new WrapperMappingModel();
}
@Override
default public void setObject(T object) {
throw new UnsupportedOperationException("Model " + getClass() + " does not support setObject(Object)");
}
default public IMappingModel map(IFunction getter) {
final IModel self = this;
return new IMappingModel() {
@Override
public void detach() {
self.detach();
}
@Override
public U getObject() {
T object = self.getObject();
return (object == null) ? null : getter.apply(object);
}
};
}
default public IMappingModel filter(IPredicate filter) {
return map(it -> filter.test(it) ? it : null);
}
default IMappingModel map(IFunction getter, IBiConsumer setter) {
final IMappingModel self = this;
return new IMappingModel() {
@Override
public void detach() {
self.detach();
}
@Override
public U getObject() {
T selfObject = self.getObject();
return (selfObject == null) ? null : getter.apply(selfObject);
}
@Override
public void setObject(U object) {
T selfObject = self.getObject();
if (selfObject != null)
setter.accept(selfObject, object);
}
};
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy