/* * 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.perspective.editor.generator; import java.lang.annotation.Annotation; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Set; import javax.annotation.PostConstruct; import javax.inject.Inject; import org.jboss.errai.common.client.api.Caller; import org.jboss.errai.common.client.api.RemoteCallback; import org.jboss.errai.ioc.client.api.AfterInitialization; import org.jboss.errai.ioc.client.api.EntryPoint; import org.jboss.errai.ioc.client.container.IOC; import org.jboss.errai.ioc.client.container.IOCBeanDef; import org.jboss.errai.ioc.client.container.SyncBeanDef; import org.jboss.errai.ioc.client.container.SyncBeanManagerImpl; import org.uberfire.client.exporter.SingletonBeanDef; import org.uberfire.client.mvp.Activity; import org.uberfire.client.mvp.ActivityBeansCache; import org.uberfire.client.mvp.PerspectiveActivity; import org.uberfire.client.mvp.WorkbenchScreenActivity; import org.uberfire.ext.layout.editor.api.LayoutServices; import org.uberfire.ext.layout.editor.api.editor.LayoutTemplate; import org.uberfire.ext.layout.editor.client.generator.LayoutGenerator; import org.uberfire.ext.plugin.model.LayoutEditorModel; import org.uberfire.ext.plugin.model.PluginType; import org.uberfire.ext.plugin.service.PluginServices; import static org.jboss.errai.ioc.client.QualifierUtil.DEFAULT_QUALIFIERS; @EntryPoint public class PerspectiveEditorGenerator { private SyncBeanManagerImpl beanManager; private ActivityBeansCache activityBeansCache; @Inject private LayoutGenerator layoutGenerator; @Inject private Caller<PluginServices> pluginServices; @Inject private Caller<LayoutServices> layoutServices; @PostConstruct public void setup() { beanManager = (SyncBeanManagerImpl) IOC.getBeanManager(); activityBeansCache = beanManager.lookupBean(ActivityBeansCache.class).getInstance(); } @AfterInitialization public void loadPerspectives() { pluginServices.call(new RemoteCallback<Collection<LayoutEditorModel>>() { @Override public void callback(final Collection<LayoutEditorModel> response) { for (LayoutEditorModel layoutEditorModel : response) { generatePerspective(layoutEditorModel.getLayoutEditorModel()); } } }).listLayoutEditor(PluginType.PERSPECTIVE_LAYOUT); } public void generatePerspective(String layoutEditorModel) { layoutServices.call(new RemoteCallback<LayoutTemplate>() { @Override public void callback(final LayoutTemplate perspective) { if (perspective != null) { generate(perspective); } } }).convertLayoutFromString(layoutEditorModel); } public void generate(LayoutTemplate layoutTemplate) { if (isANewPerspective(layoutTemplate)) { PerspectiveEditorScreenActivity screen = createNewScreen(layoutTemplate); createNewPerspective(layoutTemplate, screen); } else { PerspectiveEditorScreenActivity screen = updateScreen(layoutTemplate); updatePerspective(layoutTemplate, screen); } } private void updatePerspective(LayoutTemplate layoutTemplate, PerspectiveEditorScreenActivity screen) { final SyncBeanDef<Activity> activity = activityBeansCache.getActivity(layoutTemplate.getName()); final PerspectiveEditorActivity perspectiveEditorActivity = (PerspectiveEditorActivity) activity.getInstance(); perspectiveEditorActivity.update(layoutTemplate, screen); } private PerspectiveEditorScreenActivity updateScreen(LayoutTemplate layoutTemplate) { final SyncBeanDef<Activity> activity = activityBeansCache.getActivity(layoutTemplate.getName() + PerspectiveEditorScreenActivity.screenSufix()); final PerspectiveEditorScreenActivity screenActivity = (PerspectiveEditorScreenActivity) activity.getInstance(); screenActivity.setLayoutTemplate(layoutTemplate); return screenActivity; } private void createNewPerspective(LayoutTemplate perspective, PerspectiveEditorScreenActivity screen) { final PerspectiveEditorActivity activity = new PerspectiveEditorActivity(perspective, screen); beanManager.registerBean(new SingletonBeanDef<PerspectiveActivity, PerspectiveEditorActivity>(activity, PerspectiveActivity.class, new HashSet<Annotation>(Arrays.asList(DEFAULT_QUALIFIERS)), perspective.getName(), true)); activityBeansCache.addNewPerspectiveActivity(beanManager.lookupBeans(perspective.getName()).iterator().next()); } private PerspectiveEditorScreenActivity createNewScreen(LayoutTemplate perspective) { PerspectiveEditorScreenActivity activity = new PerspectiveEditorScreenActivity(perspective, layoutGenerator); final Set<Annotation> qualifiers = new HashSet<Annotation>(Arrays.asList(DEFAULT_QUALIFIERS)); final SingletonBeanDef<PerspectiveEditorScreenActivity, PerspectiveEditorScreenActivity> beanDef = new SingletonBeanDef<PerspectiveEditorScreenActivity, PerspectiveEditorScreenActivity>( activity, PerspectiveEditorScreenActivity.class, qualifiers, activity.getIdentifier(), true, WorkbenchScreenActivity.class, Activity.class); beanManager.registerBean(beanDef); beanManager.registerBeanTypeAlias(beanDef, Activity.class); beanManager.registerBeanTypeAlias(beanDef, WorkbenchScreenActivity.class); activityBeansCache.addNewScreenActivity(beanManager.lookupBeans(activity.getIdentifier()).iterator().next()); return activity; } private boolean isANewPerspective(LayoutTemplate layoutTemplate) { final IOCBeanDef<Activity> activity = activityBeansCache.getActivity(layoutTemplate.getName()); return activity == null; } }