/**
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.gatein.mop.core.api;
import org.gatein.mop.core.api.content.CustomizationContextResolver;
import org.gatein.mop.core.api.workspace.WorkspaceImpl;
import org.gatein.mop.core.api.workspace.SiteImpl;
import org.gatein.mop.core.api.workspace.PortalSite;
import org.gatein.mop.core.api.workspace.GroupSite;
import org.gatein.mop.core.api.workspace.UserSite;
import org.gatein.mop.core.api.workspace.UIContainerImpl;
import org.gatein.mop.core.api.workspace.UIWindowImpl;
import org.gatein.mop.core.api.workspace.UIBodyImpl;
import org.gatein.mop.core.api.workspace.PageImpl;
import org.gatein.mop.core.api.workspace.NavigationImpl;
import org.gatein.mop.core.api.workspace.WorkspaceObjectImpl;
import org.gatein.mop.core.api.workspace.UIComponentImpl;
import org.gatein.mop.core.api.workspace.PageLinkImpl;
import org.gatein.mop.core.api.workspace.URLLinkImpl;
import org.gatein.mop.api.workspace.WorkspaceCustomizationContext;
import org.gatein.mop.core.api.workspace.content.ContextSpecialization;
import org.gatein.mop.core.api.workspace.content.AbstractCustomization;
import org.gatein.mop.api.content.CustomizationContext;
import org.gatein.mop.api.content.Customization;
import org.gatein.mop.api.workspace.Workspace;
import org.gatein.mop.api.workspace.ObjectType;
import org.gatein.mop.api.workspace.WorkspaceObject;
import org.gatein.mop.api.Model;
import org.chromattic.api.ChromatticSession;
import org.chromattic.api.event.LifeCycleListener;
import org.gatein.mop.spi.AdapterLifeCycle;
import java.util.Iterator;
import java.util.Map;
import java.util.HashMap;
/**
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
public class ModelImpl implements Model
{
/** . */
private static final Map<ObjectType<?>, Class<? extends WorkspaceObjectImpl>> typeToClassImpl;
static
{
Map<ObjectType<?>, Class<? extends WorkspaceObjectImpl>> tmp = new HashMap<ObjectType<?>, Class<? extends WorkspaceObjectImpl>>();
tmp.put(ObjectType.ANY, WorkspaceObjectImpl.class);
tmp.put(ObjectType.WORKSPACE, WorkspaceImpl.class);
tmp.put(ObjectType.SITE, SiteImpl.class);
tmp.put(ObjectType.PORTAL_SITE, PortalSite.class);
tmp.put(ObjectType.GROUP_SITE, GroupSite.class);
tmp.put(ObjectType.USER_SITE, UserSite.class);
tmp.put(ObjectType.PAGE, PageImpl.class);
tmp.put(ObjectType.NAVIGATION, NavigationImpl.class);
tmp.put(ObjectType.COMPONENT, UIComponentImpl.class);
tmp.put(ObjectType.BODY, UIBodyImpl.class);
tmp.put(ObjectType.CONTAINER, UIContainerImpl.class);
tmp.put(ObjectType.WINDOW, UIWindowImpl.class);
tmp.put(ObjectType.PAGE_LINK, PageLinkImpl.class);
tmp.put(ObjectType.URL_LINK, URLLinkImpl.class);
typeToClassImpl = tmp;
}
/** . */
private final ChromatticSession session;
/** . */
private WorkspaceImpl workspace;
/** . */
private final MOPService mop;
/** . */
private final CustomizationContextResolver customizationContextResolver = new CustomizationContextResolver()
{
public CustomizationContext resolve(String contextType, String contextId)
{
if (WorkspaceCustomizationContext.TYPE.equals(contextType))
{
return findObjectById(ObjectType.WINDOW, contextId);
}
else
{
return mop.customizationContextResolvers.resolve(contextType, contextId);
}
}
};
public ModelImpl(MOPService mop, ChromatticSession session)
{
this.session = session;
this.mop = mop;
//
session.addEventListener(contextualizer);
}
public ChromatticSession getSession()
{
return session;
}
public Workspace getWorkspace()
{
return getWorkspaceImpl();
}
public <A> AdapterLifeCycle<Object, A> getAdapter(Object o, Class<A> adapterType)
{
AdapterRegistration<Object, A> registration = AdapterRegistration.getInstance(adapterType);
//
if (registration != null)
{
if (registration.adapteeType.isInstance(o))
{
return registration.factory;
}
else
{
return null;
}
}
else
{
return null;
}
}
public <A> boolean isAdaptable(Class<A> adapterType)
{
return AdapterRegistration.getInstance(adapterType) != null;
}
private WorkspaceImpl getWorkspaceImpl()
{
if (workspace == null)
{
workspace = session.findByPath(WorkspaceImpl.class, "mop:workspace");
if (workspace == null)
{
workspace = session.insert(WorkspaceImpl.class, "mop", "workspace");
}
}
return workspace;
}
public void save()
{
session.save();
}
public void close()
{
session.close();
}
private final LifeCycleListener contextualizer = new LifeCycleListener()
{
public void created(Object o)
{
inject(o, false);
}
public void loaded(String id, String path, String name, Object o)
{
inject(o, true);
}
public void added(String id, String path, String name, Object o)
{
inject(o, true);
}
public void removed(String id, String path, String name, Object o)
{
}
};
public Customization<?> findCustomizationById(String id)
{
return session.findById(Customization.class, id);
}
public <O extends WorkspaceObject> Iterator<O> findObject(ObjectType<O> type, String statement)
{
Class<O> impl = (Class<O>)typeToClassImpl.get(type);
return session.createQueryBuilder(impl).where(statement).get().objects();
}
public String pathOf(WorkspaceObject o)
{
return session.getPath(o);
}
public <O extends WorkspaceObject> O findObjectByPath(ObjectType<? extends O> type, String path)
{
Class<? extends O> t = type.getJavaType();
return session.findByPath(t, path);
}
private void inject(Object o, boolean persistent)
{
if (o instanceof AbstractCustomization)
{
((AbstractCustomization)o).session = session;
((AbstractCustomization)o).registry = mop.contentManagerRegistry;
}
else if (o instanceof ContextSpecialization)
{
((ContextSpecialization)o).setCustomizationContextResolver(customizationContextResolver);
}
else if (o instanceof WorkspaceObjectImpl)
{
((WorkspaceObjectImpl)o).model = this;
}
}
public <O extends WorkspaceObject> O findObjectById(ObjectType<O> type, String id)
{
Class<? extends WorkspaceObjectImpl> impl = typeToClassImpl.get(type);
WorkspaceObjectImpl object = session.findById(impl, id);
if (object != null)
{
return type.cast(object);
}
else
{
return null;
}
}
}