/**
* Copyright 2008-2016 Qualogy Solutions B.V.
*
* 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.qualogy.qafe.mgwt.client.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.UIObject;
import com.google.gwt.user.client.ui.Widget;
import com.qualogy.qafe.mgwt.client.ui.renderer.RendererHelper;
import com.qualogy.qafe.mgwt.client.views.AbstractView;
import com.qualogy.qafe.mgwt.client.vo.ui.ComponentGVO;
import com.qualogy.qafe.mgwt.client.vo.ui.WindowGVO;
public class ComponentRepository {
private static ComponentRepository instance = null;
private Map<String,AbstractView> views = new HashMap<String,AbstractView>();
private Map<String,UIObject> owners = new HashMap<String,UIObject>();
private Map<String,Map<UIObject,ComponentGVO>> view2Components = new HashMap<String,Map<UIObject,ComponentGVO>>();
private Map<String,Map<UIObject,ComponentGVO>> owner2Components = new HashMap<String,Map<UIObject,ComponentGVO>>();
private Map<String,List<UIObject>> idBasedComponents = new HashMap<String,List<UIObject>>();
private Map<String,List<UIObject>> nameBasedComponents = new HashMap<String,List<UIObject>>();
private Map<String,List<UIObject>> groupBasedComponents = new HashMap<String,List<UIObject>>();
// TODO
private Map<String, List<UIObject>> componentMap = new HashMap<String, List<UIObject>>(17);
private Map<String, List<UIObject>> namedComponentMap = new HashMap<String, List<UIObject>>();
private Map<String, List<UIObject>> groupedComponentMap = new HashMap<String, List<UIObject>>();
public static ComponentRepository getInstance() {
if (instance == null) {
instance = new ComponentRepository();
}
return instance;
}
public AbstractView getView(String viewKey) {
return views.get(viewKey);
}
public void addView(String windowId, String context, AbstractView view, WindowGVO viewGVO) {
String viewKey = generateViewKey(windowId, context);
addView(viewKey, view, viewGVO);
}
public void addView(String viewKey, AbstractView view, WindowGVO viewGVO) {
// TODO with WindowGVO
if (viewKey == null) {
return;
}
if (view == null) {
return;
}
views.put(viewKey, view);
}
public UIObject getOwner(String viewKey, String ownerId) {
String ownerKey = generateOwnerKey(ownerId, viewKey);
return owners.get(ownerKey);
}
public void addOwner(String ownerId, String windowId, String context, UIObject owner, ComponentGVO ownerGVO) {
String viewKey = generateViewKey(windowId, context);
addOwner(viewKey, ownerId, owner, ownerGVO);
}
public void addOwner(String viewKey, String ownerId, UIObject owner, ComponentGVO ownerGVO) {
if (viewKey == null) {
return;
}
if (ownerId == null) {
return;
}
if (owner == null) {
return;
}
String ownerKey = generateOwnerKey(ownerId, viewKey);
owners.put(ownerKey, owner);
}
public Map<UIObject,ComponentGVO> getComponents(String viewKey) {
Map<UIObject,ComponentGVO> components = view2Components.get(viewKey);
return components;
}
public Map<UIObject,ComponentGVO> getComponents(String viewKey, String ownerId) {
String ownerKey = generateOwnerKey(ownerId, viewKey);
Map<UIObject,ComponentGVO> components = owner2Components.get(ownerKey);
return components;
}
public boolean removeComponents(String viewKey, String ownerId) {
Map<UIObject,ComponentGVO> ownerComponents = getComponents(viewKey, ownerId);
if (ownerComponents == null) {
return false;
}
Map<UIObject,ComponentGVO> viewComponents = getComponents(viewKey);
if (viewComponents != null) {
Iterator<UIObject> itrWidget = ownerComponents.keySet().iterator();
while (itrWidget.hasNext()) {
UIObject widget = itrWidget.next();
ComponentGVO componentGVO = ownerComponents.get(widget);
removeComponent(viewKey, widget, componentGVO, viewComponents);
}
}
ownerComponents.clear();
return true;
}
private void removeComponent(String viewKey, UIObject widget, ComponentGVO componentGVO, Map<UIObject,ComponentGVO> components) {
String componentKey = null;
String componentId = componentGVO.getId();
if (componentId != null) {
componentKey = generateComponentKey(componentId, viewKey);
idBasedComponents.remove(componentKey);
}
String componentName = componentGVO.getFieldName();
if (componentName != null) {
componentKey = generateComponentKey(componentName, viewKey);
List<UIObject> widgets = getComponentByName(componentKey);
removeComponent(widget, widgets);
}
String componentGroup = componentGVO.getGroup();
if (componentGroup != null) {
componentKey = generateComponentKey(componentGroup, viewKey);
List<UIObject> widgets = getComponentByGroup(componentKey);
removeComponent(widget, widgets);
}
components.remove(widget);
}
private void removeComponent(UIObject widget, List<UIObject> widgets) {
if (widget == null) {
return;
}
if (widgets == null) {
return;
}
for (int i=0; i<widgets.size(); i++) {
if (widget == widgets.get(i)) {
widgets.remove(i);
break;
}
}
}
public List<UIObject> getComponentById(String componentKey) {
List<UIObject> components = idBasedComponents.get(componentKey);
return components;
}
public List<UIObject> getComponentByName(String componentKey) {
List<UIObject> components = nameBasedComponents.get(componentKey);
return components;
}
public List<UIObject> getComponentByGroup(String componentKey) {
List<UIObject> components = groupBasedComponents.get(componentKey);
return components;
}
public void addComponent(String ownerId, String windowId, String context, UIObject widget, ComponentGVO componentGVO) {
String viewKey = generateViewKey(windowId, context);
addComponent(viewKey, ownerId, widget, componentGVO);
}
public void addComponent(String viewKey, String ownerId, UIObject widget, ComponentGVO componentGVO) {
if (viewKey == null) {
return;
}
if ((widget == null) ||(componentGVO == null)) {
return;
}
Map<UIObject,ComponentGVO> components = view2Components.get(viewKey);
if (components == null) {
components = new HashMap<UIObject,ComponentGVO>();
view2Components.put(viewKey, components);
}
if (components.containsKey(widget)) {
return;
}
components.put(widget, componentGVO);
if (ownerId != null) {
String ownerKey = generateOwnerKey(ownerId, viewKey);
Map<UIObject,ComponentGVO> ownerComponents = owner2Components.get(ownerKey);
if (ownerComponents == null) {
ownerComponents = new HashMap<UIObject,ComponentGVO>();
owner2Components.put(ownerKey, ownerComponents);
}
ownerComponents.put(widget, componentGVO);
}
registerComponentById(viewKey, widget, componentGVO);
registerComponentByName(viewKey, widget, componentGVO);
registerComponentByGroup(viewKey, widget, componentGVO);
}
private void registerComponentById(String viewKey, UIObject widget, ComponentGVO componentGVO) {
String componentId = componentGVO.getId();
registerComponent(viewKey, componentId, widget, componentGVO, idBasedComponents);
}
private void registerComponentByName(String viewKey, UIObject widget, ComponentGVO componentGVO) {
String componentName = componentGVO.getFieldName();
registerComponent(viewKey, componentName, widget, componentGVO, nameBasedComponents);
}
private void registerComponentByGroup(String viewKey, UIObject widget, ComponentGVO componentGVO) {
String componentGroup = componentGVO.getGroup();
registerComponent(viewKey, componentGroup, widget, componentGVO, groupBasedComponents);
}
private void registerComponent(String viewKey, String component, UIObject widget, ComponentGVO componentGVO, Map<String,List<UIObject>> xBasedComponents) {
if (component != null) {
component = generateComponentKey(component, viewKey);
List<UIObject> components = xBasedComponents.get(component);
if (components == null) {
components = new ArrayList<UIObject>();
xBasedComponents.put(component, components);
}
if (components.contains(widget)) {
return;
}
components.add(widget);
}
}
public String generateViewKey(String windowId, String context) {
if (context == null) {
return null;
}
String viewKey = context;
if (windowId != null) {
viewKey = windowId + "|" + viewKey;
}
return viewKey;
}
public String generateOwnerKey(String ownerId, String windowId, String context) {
String viewKey = generateViewKey(windowId, context);
String ownerKey = generateOwnerKey(ownerId, viewKey);
return ownerKey;
}
public String generateOwnerKey(String ownerId, String viewKey) {
String componentKey = generateComponentKey(ownerId, viewKey);
return componentKey;
}
public String generateComponentKey(String component, String windowId, String context) {
String viewKey = generateViewKey(windowId, context);
String componentKey = generateComponentKey(component, viewKey);
return componentKey;
}
public String generateComponentKey(String component, String viewKey) {
String componentKey = viewKey;
if (component != null) {
componentKey = component + "|" + componentKey;
}
return componentKey;
}
private Map<String, List<UIObject>> getComponentMap() {
return componentMap;
}
public void putNamedComponent(final String key, UIObject uiObject) {
if (!getNamedComponentMap().containsKey(key)) {
List<UIObject> listOfUIObject = new ArrayList<UIObject>();
listOfUIObject.add(uiObject);
getNamedComponentMap().put(key, listOfUIObject);
} else {
List<UIObject> listOfUIObject = getNamedComponentMap().get(key);
listOfUIObject.add(uiObject);
// ClientApplicationContext.getInstance().log("Component repository","Key "
// + key +
// " is already in the named componentstorage. You are overwriting the same id!!",
// false,false,null);
}
}
public void putGroupedComponent(final String key, UIObject uiObject) {
if (!getGroupedComponentMap().containsKey(key)) {
List<UIObject> listOfUIObject = new ArrayList<UIObject>();
listOfUIObject.add(uiObject);
getGroupedComponentMap().put(key, listOfUIObject);
} else {
List<UIObject> listOfUIObject = getGroupedComponentMap().get(key);
listOfUIObject.add(uiObject);
}
}
public List<UIObject> getNamedComponent(final String key) {
if (getNamedComponentMap().containsKey(key)) {
return getNamedComponentMap().get(key);
} else {
return null;
}
}
public List<UIObject> getGroupedComponent(final String key) {
if (getGroupedComponentMap().containsKey(key)) {
return getGroupedComponentMap().get(key);
} else {
return null;
}
}
public void remove(String key) {
if (getComponentMap().containsKey(key)) {
getComponentMap().remove(key);
}
}
public void putComponent(final String key, UIObject uiObject) {
if (!getComponentMap().containsKey(key)) {
List<UIObject> listOfUIObject = new ArrayList<UIObject>();
listOfUIObject.add(uiObject);
getComponentMap().put(key, listOfUIObject);
} else {
List<UIObject> listOfUIObject = getComponentMap().get(key);
listOfUIObject.add(uiObject);
// ClientApplicationContext.getInstance().log("Component repository","Key "
// + key +
// " is already in the componentstorage. You are overwriing the same id!!",
// false,false,null);
}
}
public List<UIObject> getComponent(final String key) {
if (getComponentMap().containsKey(key)) {
return getComponentMap().get(key);
} else {
return null;
}
}
public void removeAllItemsForWindow(String windowId, String context) {
if ((windowId != null) && (context != null)) {
// The id of the ui-window is winId|winId|appId
// (<id>|<parent>|<context>),
// while the id of ui-components within a window is
// componentId|winId|appId,
// so the key to match is |winId|appId
String key = RendererHelper.generateId("", windowId, context);
removeItemsWhenMatchKey(getComponentMap(), key);
removeItemsWhenMatchKey(getNamedComponentMap(), key);
removeItemsWhenMatchKey(getGroupedComponentMap(), key);
}
}
private void removeItemsWhenMatchKey(Map<String, List<UIObject>> map,
String key2Match) {
if ((map != null) && (key2Match != null)) {
List<String> removeKeyList = new ArrayList<String>();
Iterator<String> itrKey = map.keySet().iterator();
while (itrKey.hasNext()) {
String key = (String) itrKey.next();
if (key.indexOf(key2Match) > -1) {
removeKeyList.add(key);
}
}
for (String removeKey : removeKeyList) {
List<UIObject> uiObjectList = map.get(removeKey);
if (uiObjectList != null) {
uiObjectList.clear();
}
map.remove(removeKey);
}
}
}
public Map<String, List<UIObject>> getNamedComponentMap() {
return namedComponentMap;
}
public void clearAll() {
clearMap(getNamedComponentMap());
clearMap(getComponentMap());
}
private void clearMap(Map<String, List<UIObject>> map) {
if (map != null) {
map.clear();
}
}
public void clearContainerComponent(Widget innerComponent) {
if (innerComponent != null) {
if (innerComponent instanceof HasWidgets) {
HasWidgets hasWidgets = (HasWidgets) innerComponent;
for (Widget widget : hasWidgets) {
// search repository using component id and remove it.
String key = DOM.getElementAttribute(widget.getElement(),
"id");
List<UIObject> uiObjects = getComponentMap().get(key);
if (uiObjects != null) {
// getting ready to garbage collect.
uiObjects.clear();
}
getComponentMap().remove(key);
// search repository using component name and remove it.
String nameKey = DOM.getElementAttribute(
widget.getElement(), "fn");
List<UIObject> namedUiObjects = getNamedComponentMap().get(
nameKey);
if (namedUiObjects != null) {
// getting ready to garbage collect.
namedUiObjects.clear();
}
getNamedComponentMap().remove(key);
// search repository using component group and remove it.
String groupKey = DOM.getElementAttribute(
widget.getElement(), "grp");
List<UIObject> groupedUiObjects = getGroupedComponentMap().get(
groupKey);
if (groupedUiObjects != null) {
// getting ready to garbage collect.
groupedUiObjects.clear();
}
getGroupedComponentMap().remove(key);
clearContainerComponent(widget);
}
}
}
}
public Map<String, List<UIObject>> getGroupedComponentMap() {
return groupedComponentMap;
}
public void setGroupedComponentMap(
Map<String, List<UIObject>> groupedComponentMap) {
this.groupedComponentMap = groupedComponentMap;
}
}