读书人

screen,menu,form等里头的action

发布时间: 2012-07-15 20:20:06 作者: rapoo

screen,menu,form等里面的action
以screen为例
其他类似

screen的action内容是由
ModelScreenAction负责处理的。
其他类似的还有
ModelFormAction
ModelMenuAction
ModelTreeAction

其方法
是读取每个子元素,并初始化处理方式的。
先看
property-map的处理是由 actions.add(new PropertyMap(modelScreen, actionElement));
PropertyMap负责处理的。
public static List<ModelScreenAction> readSubActions(ModelScreen modelScreen, Element parentElement) {
List<ModelScreenAction> actions = FastList.newInstance();

List<? extends Element> actionElementList = UtilXml.childElementList(parentElement);
for (Element actionElement: actionElementList) {
if ("set".equals(actionElement.getNodeName())) {
actions.add(new SetField(modelScreen, actionElement));
} else if ("property-map".equals(actionElement.getNodeName())) {
actions.add(new PropertyMap(modelScreen, actionElement));
} else if ("property-to-field".equals(actionElement.getNodeName())) {
actions.add(new PropertyToField(modelScreen, actionElement));
} else if ("script".equals(actionElement.getNodeName())) {
actions.add(new Script(modelScreen, actionElement));
} else if ("service".equals(actionElement.getNodeName())) {
actions.add(new Service(modelScreen, actionElement));
} else if ("entity-one".equals(actionElement.getNodeName())) {
actions.add(new EntityOne(modelScreen, actionElement));
} else if ("entity-and".equals(actionElement.getNodeName())) {
actions.add(new EntityAnd(modelScreen, actionElement));
} else if ("entity-condition".equals(actionElement.getNodeName())) {
actions.add(new EntityCondition(modelScreen, actionElement));
} else if ("get-related-one".equals(actionElement.getNodeName())) {
actions.add(new GetRelatedOne(modelScreen, actionElement));
} else if ("get-related".equals(actionElement.getNodeName())) {
actions.add(new GetRelated(modelScreen, actionElement));
} else {
throw new IllegalArgumentException("Action element not supported with name: " + actionElement.getNodeName());
}
}

return actions;
}



PropertyMap 是ModelScreenAction的子类,它的实现如下

@Override
public void runAction(Map<String, Object> context) {
String globalStr = this.globalExdr.expandString(context);
// default to false
boolean global = "true".equals(globalStr);

Locale locale = (Locale) context.get("locale");
String resource = this.resourceExdr.expandString(context, locale);

ResourceBundleMapWrapper existingPropMap = this.mapNameAcsr.get(context);
if (existingPropMap == null) {
this.mapNameAcsr.put(context, UtilProperties.getResourceBundleMap(resource, locale, context));
} else {
try {
existingPropMap.addBottomResourceBundle(resource);
} catch (IllegalArgumentException e) {
// log the error, but don't let it kill everything just for a typo or bad char in an l10n file
Debug.logError(e, "Error adding resource bundle [" + resource + "]: " + e.toString(), module);
}
}

if (global) {
Map<String, Object> globalCtx = UtilGenerics.checkMap(context.get("globalContext"));
if (globalCtx != null) {
ResourceBundleMapWrapper globalExistingPropMap = this.mapNameAcsr.get(globalCtx);
if (globalExistingPropMap == null) {
this.mapNameAcsr.put(globalCtx, UtilProperties.getResourceBundleMap(resource, locale, context));
} else {
// is it the same object? if not add it in here too...
if (existingPropMap != globalExistingPropMap) {
try {
globalExistingPropMap.addBottomResourceBundle(resource);
} catch (IllegalArgumentException e) {
// log the error, but don't let it kill everything just for a typo or bad char in an l10n file
Debug.logError(e, "Error adding resource bundle [" + resource + "]: " + e.toString(), module);
}
}
}
}
}
}
}

这里顺带提下
最后会调用UtilProperties的resolvePropertiesUrl方法来生成实际的资源名字。
这个方法有代码

url = FlexibleLocation.resolveLocation(resourceName + ".properties");
if (url != null) {
return url;
}
// Check for Java XML properties file
url = FlexibleLocation.resolveLocation(resourceName + ".xml");
if (url != null) {
return url;
}

可见ofbiz10.4是先查询properties文件是否存在,再检查xml文件是否存在。

读书人网 >开源软件

热点推荐