/* 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.riotfamily.core.screen; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.riotfamily.common.util.Generics; import org.riotfamily.common.web.mvc.mapping.HandlerUrlUtils; import org.riotfamily.core.dao.Hierarchy; import org.riotfamily.core.dao.RiotDao; public class DefaultScreenContext implements ScreenContext { private RiotScreen screen; private RiotDao dao; private HttpServletRequest request; private String objectId; private String parentId; private boolean nestedTreeItem; private Object object; private Object parent; public DefaultScreenContext(RiotScreen screen, HttpServletRequest request, String objectId, String parentId, boolean nestedTreeItem) { this.screen = screen; this.request = request; this.objectId = objectId; this.parentId = parentId; this.nestedTreeItem = nestedTreeItem; this.dao = ScreenUtils.getDao(screen); } public DefaultScreenContext(RiotScreen screen, Object object, Object parent, boolean nestedTreeItem, ScreenContext other) { this.screen = screen; this.object = object; this.parent = parent; this.nestedTreeItem = nestedTreeItem; this.request = other.getRequest(); this.dao = ScreenUtils.getDao(screen); } public String getObjectId() { if (objectId == null && object != null && dao != null) { objectId = dao.getObjectId(object); } return objectId; } public void setObjectId(String objectId) { this.objectId = objectId; } public String getParentId() { if (parentId == null && getParent() != null) { if (nestedTreeItem) { parentId = dao.getObjectId(parent); } else { ListScreen parentList = ScreenUtils.getParentListScreen(screen); if (parentList != null) { parentId = parentList.getDao().getObjectId(parent); } } } return parentId; } public boolean isNestedTreeItem() { return nestedTreeItem; } public RiotScreen getScreen() { return screen; } public RiotDao getDao() { return dao; } public HttpServletRequest getRequest() { return request; } public DefaultScreenContext createParentContext() { RiotScreen parentScreen = screen.getParentScreen(); if (parentScreen == null) { return null; } if (screen instanceof ListScreen) { return new DefaultScreenContext(parentScreen, getParent(), null, false, this); } if (getObject() == null) { if (nestedTreeItem) { return new DefaultScreenContext(parentScreen, getParent(), null, false, this); } return new DefaultScreenContext(parentScreen, null, getParent(), false, this); } return new DefaultScreenContext(parentScreen, getObject(), null, false, this); } public DefaultScreenContext createNewItemContext(Object parentTreeItem) { boolean nested = parentTreeItem != null; Object newParent = nested ? parentTreeItem : getParent(); RiotScreen itemScreen = ScreenUtils.getListScreen(screen).getItemScreen(); return new DefaultScreenContext(itemScreen, null, newParent, nested, this); } public DefaultScreenContext createItemContext(Object item) { RiotScreen itemScreen = ScreenUtils.getListScreen(screen).getItemScreen(); if (itemScreen instanceof ListScreen) { return new DefaultScreenContext(itemScreen, null, item, false, this); } return new DefaultScreenContext(itemScreen, item, null, false, this); } public DefaultScreenContext createChildContext(RiotScreen screen) { if (screen instanceof ListScreen) { return new DefaultScreenContext(screen, null, getObject(), false, this); } return new DefaultScreenContext(screen, getObject(), null, false, this); } public String getListStateKey() { return ScreenUtils.getListScreen(getScreen()).getListStateKey(this); } public void setObject(Object object) { this.object = object; } public Object getObject() { if (object == null && objectId != null) { object = dao.load(objectId); } return object; } public Object getParent() { if (parent == null) { if (parentId != null) { if (nestedTreeItem) { parent = dao.load(parentId); } else { ListScreen parentList = ScreenUtils.getParentListScreen(screen); parent = parentList.getDao().load(parentId); } } else if (getObject() != null) { if (dao instanceof Hierarchy) { parent = ((Hierarchy) dao).getParent(object); } } } return parent; } public String getTitle() { return screen.getTitle(this); } public String getUrl() { return HandlerUrlUtils.getContextRelativeUrl(request, screen.getId(), this); } public ScreenLink getLink() { boolean isNew = object == null && objectId == null && screen instanceof ItemScreen; return new ScreenLink(getTitle(), getUrl(), screen.getIcon(), isNew); } public List<ScreenLink> getPath() { List<ScreenLink> path = Generics.newArrayList(); DefaultScreenContext ctx = this; while (ctx != null) { path.add(0, ctx.getLink()); ctx = ctx.createParentContext(); } return path; } @Override public String toString() { return String.format("ScreenContext[screen=%s]", getScreen() != null ? getScreen().getId() : null); } }