/*
* Copyright 2015 JBoss, by Red Hat, Inc
*
* 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.uberfire.ext.plugin.client.editor;
import java.util.Collection;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import com.google.gwt.core.client.ScriptInjector;
import com.google.gwt.dom.client.StyleInjector;
import org.jboss.errai.common.client.api.Caller;
import org.jboss.errai.common.client.api.RemoteCallback;
import org.jboss.errai.ioc.client.container.SyncBeanManager;
import org.uberfire.backend.vfs.ObservablePath;
import org.uberfire.client.mvp.ActivityBeansInfo;
import org.uberfire.client.workbench.events.ChangeTitleWidgetEvent;
import org.uberfire.client.workbench.type.ClientResourceType;
import org.uberfire.ext.editor.commons.client.BaseEditor;
import org.uberfire.ext.editor.commons.client.BaseEditorView;
import org.uberfire.ext.editor.commons.client.file.popups.SavePopUpPresenter;
import org.uberfire.ext.editor.commons.client.validation.Validator;
import org.uberfire.ext.editor.commons.service.support.SupportsCopy;
import org.uberfire.ext.editor.commons.service.support.SupportsDelete;
import org.uberfire.ext.editor.commons.service.support.SupportsRename;
import org.uberfire.ext.plugin.client.validation.PluginNameValidator;
import org.uberfire.ext.plugin.event.NewPluginRegistered;
import org.uberfire.ext.plugin.event.PluginAdded;
import org.uberfire.ext.plugin.event.PluginDeleted;
import org.uberfire.ext.plugin.event.PluginRenamed;
import org.uberfire.ext.plugin.event.PluginSaved;
import org.uberfire.ext.plugin.event.PluginUnregistered;
import org.uberfire.ext.plugin.model.Media;
import org.uberfire.ext.plugin.model.Plugin;
import org.uberfire.ext.plugin.model.PluginContent;
import org.uberfire.ext.plugin.model.PluginSimpleContent;
import org.uberfire.ext.plugin.model.PluginType;
import org.uberfire.ext.plugin.model.RuntimePlugin;
import org.uberfire.ext.plugin.service.PluginServices;
import org.uberfire.lifecycle.OnStartup;
import org.uberfire.mvp.ParameterizedCommand;
import org.uberfire.mvp.PlaceRequest;
import static com.google.gwt.core.client.ScriptInjector.TOP_WINDOW;
import static org.uberfire.ext.editor.commons.client.menu.MenuItems.COPY;
import static org.uberfire.ext.editor.commons.client.menu.MenuItems.DELETE;
import static org.uberfire.ext.editor.commons.client.menu.MenuItems.RENAME;
import static org.uberfire.ext.editor.commons.client.menu.MenuItems.SAVE;
public abstract class RuntimePluginBaseEditor extends BaseEditor {
protected Plugin plugin;
@Inject
private Caller<PluginServices> pluginServices;
@Inject
private PluginNameValidator pluginNameValidator;
@Inject
private Event<NewPluginRegistered> newPluginRegisteredEvent;
@Inject
private Event<PluginUnregistered> pluginUnregisteredEvent;
@Inject
private SyncBeanManager beanManager;
@Inject
private ActivityBeansInfo activityBeansInfo;
@Inject
private SavePopUpPresenter savePopUpPresenter;
protected RuntimePluginBaseEditor(final BaseEditorView baseView) {
super(baseView);
}
protected abstract PluginType getPluginType();
protected abstract ClientResourceType getResourceType();
@OnStartup
public void onStartup(final ObservablePath path,
final PlaceRequest place) {
init(path,
place,
getResourceType(),
true,
false,
SAVE,
COPY,
RENAME,
DELETE);
// This is only used to define the "name" used by @WorkbenchPartTitle which is called by Uberfire after @OnStartup
// but before the async call in "loadContent()" has returned. When the *real* plugin is loaded this is overwritten
this.plugin = new Plugin(place.getParameter("name",
""),
getPluginType(),
path);
this.place = place;
}
protected void onPlugInRenamed(@Observes final PluginRenamed pluginRenamed) {
if (pluginRenamed.getOldPluginName().equals(plugin.getName()) &&
pluginRenamed.getPlugin().getType().equals(plugin.getType())) {
this.plugin = new Plugin(pluginRenamed.getPlugin().getName(),
getPluginType(),
pluginRenamed.getPlugin().getPath());
changeTitleNotification.fire(new ChangeTitleWidgetEvent(place,
getTitleText(),
getTitle()));
}
}
protected Caller<? extends SupportsDelete> getDeleteServiceCaller() {
return pluginServices;
}
protected Caller<? extends SupportsRename> getRenameServiceCaller() {
return pluginServices;
}
protected Caller<? extends SupportsCopy> getCopyServiceCaller() {
return pluginServices;
}
@Override
protected void loadContent() {
getPluginServices().call(new RemoteCallback<PluginContent>() {
@Override
public void callback(final PluginContent response) {
view().setFramework(response.getFrameworks());
view().setupContent(response,
new ParameterizedCommand<Media>() {
@Override
public void execute(final Media media) {
getPluginServices().call().deleteMedia(media);
}
});
view().hideBusyIndicator();
setOriginalHash(getContent().hashCode());
}
}).getPluginContent(getCurrentPath());
}
ObservablePath getCurrentPath() {
return versionRecordManager.getCurrentPath();
}
public PluginSimpleContent getContent() {
return new PluginSimpleContent(view().getContent(),
view().getTemplate(),
view().getCss(),
view().getCodeMap(),
view().getFrameworks(),
view().getContent().getLanguage());
}
protected void save() {
savePopUpPresenter.show(getCurrentPath(),
getSaveCommand());
concurrentUpdateSessionInfo = null;
}
ParameterizedCommand<String> getSaveCommand() {
return new ParameterizedCommand<String>() {
@Override
public void execute(final String commitMessage) {
getPluginServices().call(getSaveSuccessCallback(getContent().hashCode())).save(
getContent(),
commitMessage);
view().onSave();
}
};
}
public boolean mayClose() {
view().onClose();
return super.mayClose(getContent().hashCode());
}
abstract RuntimePluginBaseView view();
Caller<PluginServices> getPluginServices() {
return pluginServices;
}
Integer getOriginalHash() {
return originalHash;
}
@Override
public Validator getRenameValidator() {
return pluginNameValidator;
}
@Override
public Validator getCopyValidator() {
return pluginNameValidator;
}
public void onPluginSaved(@Observes PluginSaved pluginSaved) {
registerPlugin(pluginSaved.getPlugin());
}
public void onPluginAdded(@Observes PluginAdded pluginAdded) {
registerPlugin(pluginAdded.getPlugin());
}
public void onPluginDeleted(@Observes PluginDeleted pluginDeleted) {
unregisterPlugin(pluginDeleted.getPluginName(),
pluginDeleted.getPluginType());
}
public void onPluginRenamed(@Observes PluginRenamed pluginRenamed) {
unregisterPlugin(pluginRenamed.getOldPluginName(),
pluginRenamed.getOldPluginType());
registerPlugin(pluginRenamed.getPlugin());
}
void unregisterPlugin(String name,
PluginType type) {
pluginUnregisteredEvent.fire(new PluginUnregistered(name,
type));
}
void registerPlugin(Plugin plugin) {
pluginServices.call(new RemoteCallback<Collection<RuntimePlugin>>() {
@Override
public void callback(final Collection<RuntimePlugin> runtimePlugins) {
for (final RuntimePlugin plugin : runtimePlugins) {
ScriptInjector.fromString(plugin.getScript()).setWindow(TOP_WINDOW).inject();
StyleInjector.inject(plugin.getStyle(),
true);
}
newPluginRegisteredEvent.fire(new NewPluginRegistered(plugin.getName(),
plugin.getType()));
}
}).listPluginRuntimePlugins(plugin.getPath());
}
}