Refs #1402 Ability to define middleware views which are not deployed to client

This commit is contained in:
Konstantin Krivopustov 2012-08-07 11:54:38 +00:00
parent 7ddab51f0c
commit cfa62af17a
6 changed files with 85 additions and 10 deletions

View File

@ -109,4 +109,13 @@ public interface ClientConfig extends Config {
@DefaultString("CTRL-DELETE")
@Property("cuba.gui.tableRemoveShortcut")
String getTableRemoveShortcut();
/**
* @return If false, the client loads all server views on startup.
* If true, it loads views one by one only when needed.
* <p>Lazy loading is required if the server can contain views for entities, not available on the client.</p>
*/
@Property("cuba.lazyLoadServerViews")
@DefaultBoolean(false)
boolean getLazyLoadServerViews();
}

View File

@ -10,11 +10,9 @@ import com.haulmont.bali.util.ReflectionHelper;
import com.haulmont.chile.core.loader.ChileMetadataLoader;
import com.haulmont.chile.core.loader.MetadataLoader;
import com.haulmont.chile.core.model.MetaClass;
import com.haulmont.cuba.client.ClientConfig;
import com.haulmont.cuba.core.app.ServerInfoService;
import com.haulmont.cuba.core.global.Metadata;
import com.haulmont.cuba.core.global.MetadataBuildInfo;
import com.haulmont.cuba.core.global.View;
import com.haulmont.cuba.core.global.ViewRepository;
import com.haulmont.cuba.core.global.*;
import com.haulmont.cuba.core.sys.AbstractMetadata;
import com.haulmont.cuba.core.sys.AppContext;
import com.haulmont.cuba.core.sys.PersistentClassesMetadataLoader;
@ -43,6 +41,9 @@ public class MetadataClientImpl extends AbstractMetadata {
@Inject
private ServerInfoService serverInfoService;
@Inject
private Configuration configuration;
@Override
protected void initMetadata() {
log.info("Initializing metadata");
@ -82,12 +83,16 @@ public class MetadataClientImpl extends AbstractMetadata {
protected void initViews() {
log.info("Initializing views");
viewRepository = new ViewRepository();
boolean lazyLoadServerViews = configuration.getConfig(ClientConfig.class).getLazyLoadServerViews();
List<View> views = serverInfoService.getViews();
for (View view : views) {
MetaClass metaClass = getSession().getClass(view.getEntityClass());
viewRepository.storeView(metaClass, view);
viewRepository = new ViewRepositoryClient(lazyLoadServerViews, serverInfoService);
if (!lazyLoadServerViews) {
List<View> views = serverInfoService.getViews();
for (View view : views) {
MetaClass metaClass = getSession().getClass(view.getEntityClass());
viewRepository.storeView(metaClass, view);
}
}
String configName = AppContext.getProperty("cuba.viewsConfig");

View File

@ -0,0 +1,43 @@
/*
* Copyright (c) 2012 Haulmont Technology Ltd. All Rights Reserved.
* Haulmont Technology proprietary and confidential.
* Use is subject to license terms.
*/
package com.haulmont.cuba.client.sys;
import com.haulmont.chile.core.model.MetaClass;
import com.haulmont.cuba.core.app.ServerInfoService;
import com.haulmont.cuba.core.global.View;
import com.haulmont.cuba.core.global.ViewRepository;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author krivopustov
* @version $Id$
*/
public class ViewRepositoryClient extends ViewRepository {
private Log log = LogFactory.getLog(getClass());
private boolean lazyLoadServerViews;
private ServerInfoService serverInfoService;
public ViewRepositoryClient(boolean lazyLoadServerViews, ServerInfoService serverInfoService) {
this.lazyLoadServerViews = lazyLoadServerViews;
this.serverInfoService = serverInfoService;
}
@Override
protected View findView(MetaClass metaClass, String name) {
View view = super.findView(metaClass, name);
if (view == null && lazyLoadServerViews) {
log.trace("Search for view " + metaClass + "/" + name + " on server");
view = serverInfoService.getView(metaClass.getJavaClass(), name);
if (view != null)
storeView(metaClass, view);
}
return view;
}
}

View File

@ -6,9 +6,11 @@
package com.haulmont.cuba.core.app;
import com.haulmont.chile.core.model.MetaClass;
import com.haulmont.cuba.core.entity.Entity;
import com.haulmont.cuba.core.global.Metadata;
import com.haulmont.cuba.core.global.MetadataBuildInfo;
import com.haulmont.cuba.core.global.View;
import com.haulmont.cuba.core.global.ViewNotFoundException;
import com.haulmont.cuba.core.sys.MetadataBuildHelper;
import javax.annotation.ManagedBean;
@ -32,14 +34,17 @@ public class ServerInfoServiceBean implements ServerInfoService {
@Inject
protected ServerInfoAPI serverInfo;
@Override
public String getReleaseNumber() {
return serverInfo.getReleaseNumber();
}
@Override
public String getReleaseTimestamp() {
return serverInfo.getReleaseTimestamp();
}
@Override
public MetadataBuildInfo getMetadataBuildInfo() {
return new MetadataBuildInfo(
MetadataBuildHelper.getPersistentEntitiesPackages(),
@ -75,10 +80,20 @@ public class ServerInfoServiceBean implements ServerInfoService {
return result;
}
@Override
public List<View> getViews() {
return metadata.getViewRepository().getAll();
}
@Override
public View getView(Class<? extends Entity> entityClass, String name) {
try {
return metadata.getViewRepository().getView(entityClass, name);
} catch (ViewNotFoundException e) {
return null;
}
}
@Override
public TimeZone getTimeZone() {
return TimeZone.getDefault();

View File

@ -5,6 +5,7 @@
*/
package com.haulmont.cuba.core.app;
import com.haulmont.cuba.core.entity.Entity;
import com.haulmont.cuba.core.global.MetadataBuildInfo;
import com.haulmont.cuba.core.global.View;
@ -32,6 +33,8 @@ public interface ServerInfoService {
List<View> getViews();
View getView(Class<? extends Entity> entityClass, String name);
/**
* Return time zone used by server application.
* Useful for remote clients which may run on machines with another default time zone (like desktop client).

View File

@ -152,7 +152,7 @@ public class ViewRepository
}
}
private View findView(MetaClass metaClass, String name) {
protected View findView(MetaClass metaClass, String name) {
Map<String, View> views = storage.get(metaClass);
View view = (views == null ? null : views.get(name));
if (view == null && (name.equals(View.LOCAL) || name.equals(View.MINIMAL))) {