/*
* Copyright 2014 Red Hat, Inc. and/or its affiliates.
*
* 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.dashbuilder.client.widgets.dataset.explorer;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;
import org.dashbuilder.dataprovider.DataSetProviderType;
import org.dashbuilder.dataset.client.DataSetClientServices;
import org.dashbuilder.dataset.def.DataSetDef;
import org.dashbuilder.dataset.events.DataSetDefModifiedEvent;
import org.dashbuilder.dataset.events.DataSetDefRegisteredEvent;
import org.dashbuilder.dataset.events.DataSetDefRemovedEvent;
import org.uberfire.client.mvp.UberView;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import static org.uberfire.commons.validation.PortablePreconditions.checkNotNull;
import static org.dashbuilder.dataprovider.DataSetProviderType.*;
/**
* <p>Data Set Explorer widget.</p>
*
* @since 0.3.0
*/
@Dependent
public class DataSetExplorer implements IsWidget {
public interface View extends UberView<DataSetExplorer> {
View addPanel(final DataSetPanel.View panelView);
View clear();
}
List<DataSetProviderType> SUPPORTED_TYPES = Arrays.asList(BEAN, CSV, ELASTICSEARCH, SQL);
Instance<DataSetPanel> panelInstances;
DataSetClientServices clientServices;
View view;
List<DataSetPanel> panels = new LinkedList<DataSetPanel>();
@Inject
public DataSetExplorer(final Instance<DataSetPanel> panelInstances,
final DataSetClientServices clientServices,
final View view) {
this.panelInstances = panelInstances;
this.clientServices = clientServices;
this.view = view;
}
@PostConstruct
public void init() {
view.init(this);
}
@Override
public Widget asWidget() {
return view.asWidget();
}
public void show() {
clear();
clientServices.getPublicDataSetDefs(dataSetDefs -> {
if (dataSetDefs != null && !dataSetDefs.isEmpty()) {
dataSetDefs.stream()
.filter(DataSetExplorer.this::isSupported)
.forEach(DataSetExplorer.this::addDataSetDef);
}
});
}
private boolean isSupported(DataSetDef def) {
return SUPPORTED_TYPES.contains(def.getProvider());
}
private void addDataSetDef(final DataSetDef def) {
// Check panel for the given data set does not exists yet and it is supported as well
if (getDataSetPanel(def.getUUID()) == null) {
final DataSetPanel panel = panelInstances.get();
panels.add(panel);
panel.show(def, "dataSetsExplorerPanelGroup");
view.addPanel(panel.view);
}
}
private void updateDataSetDef(final DataSetDef def) {
DataSetPanel panel = getDataSetPanel(def.getUUID());
if (panel != null) {
panel.show(def, "dataSetsExplorerPanelGroup");
panel.close();
}
}
private DataSetPanel getDataSetPanel(final String uuid) {
if (uuid != null) {
for (final DataSetPanel panel : panels) {
if (panel.getDataSetDef().getUUID().equals(uuid)) {
return panel;
}
}
}
return null;
}
private void clear() {
panels.clear();
view.clear();
}
// Be aware of data set lifecycle events
void onDataSetDefRegisteredEvent(@Observes DataSetDefRegisteredEvent event) {
checkNotNull("event", event);
final DataSetDef def = event.getDataSetDef();
if (def != null && def.isPublic()) {
// GWT.log("Data Set Explorer - Data Set Def Registered");
addDataSetDef(def);
}
}
void onDataSetDefModifiedEvent(@Observes DataSetDefModifiedEvent event) {
checkNotNull("event", event);
final DataSetDef def = event.getNewDataSetDef();
if (def != null && def.isPublic()) {
// GWT.log("Data Set Explorer - Data Set Def Modified");
updateDataSetDef(def);
}
}
void onDataSetDefRemovedEvent(@Observes DataSetDefRemovedEvent event) {
checkNotNull("event", event);
final DataSetDef def = event.getDataSetDef();
if (def != null && def.isPublic()) {
// GWT.log("Data Set Explorer - Data Set Def Removed");
// Reload the whole data set panels list.
show();
}
}
}