/*
* Copyright 2012 Adaptrex, LLC
*
* 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.adaptrex.core.ext.jsf;
import com.adaptrex.core.Adaptrex;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.faces.component.FacesComponent;
import javax.faces.context.FacesContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.adaptrex.core.ext.data.Association;
import com.adaptrex.core.ext.data.DataConfig;
import com.adaptrex.core.ext.data.Model;
import com.adaptrex.core.ext.data.ModelDefinition;
import com.adaptrex.core.ext.data.RestProxy;
import com.adaptrex.core.persistence.AdaptrexPersistence;
import com.adaptrex.core.persistence.AdaptrexSession;
import com.adaptrex.core.utilities.StringUtilities;
@FacesComponent("ext.data.Model")
public class ModelComponent extends ExtComponentBase {
private Logger log = LoggerFactory.getLogger(ModelComponent.class);
@Override
public String getFamily() {
return "ext.data.model";
}
@Override
public void encodeBegin(FacesContext context) throws IOException {
Map<String, Object> a = getAttributes();
/*
* Definition parameters
*/
String namespace = param(a, "ns");
if (namespace == null)
namespace = param(a, "namespace");
if (namespace == null)
namespace = (String) getAttribute("namespace");
String factoryName = param(a, "factory");
String className = param(a, "table");
String name = param(a, "name");
String rest = param(a, "rest");
String include = param(a, "include");
String exclude = param(a, "exclude");
String associations = param(a, "associations");
/*
* Get or set the namespace for this store
*/
if (namespace == null) {
log.warn("Error creating model: Namespace has not been set");
write("<!-- Error creating model: Namespace has not been set -->\n");
return;
}
/*
* Get the config
*/
AdaptrexPersistence persistence = Adaptrex.getAdaptrex()
.getPersistenceManager().getPersistence(factoryName);
Class<?> clazz = persistence.getEntityClass(className);
DataConfig config = new DataConfig(clazz, persistence);
/*
* Create the model
*/
AdaptrexSession session = new AdaptrexSession(persistence);
Model model = new Model(session, config);
/*
* Set the model name
*/
String modelName = namespace + ".model."
+ (name != null ? name : className);
config.setModelName(name);
if (include != null) {
config.include(include);
}
if (exclude != null) {
config.exclude(exclude);
}
/*
* Add associations
*/
if (associations != null) {
config.associations(associations);
}
/*
* The proxy needs additinoal information from the model. We shouldn't
* create the proxy until the store has been fully configured
*/
if (rest != null) {
String restPath = getRequest().getContextPath()
+ "/rest/"
+ (rest.equals("true") ? clazz.getSimpleName()
.toLowerCase() : rest);
config.setProxy(new RestProxy(restPath, config));
}
/*
* TODO: Make sure we're outputting our model definition in the same way
* as in the store
*/
ModelDefinition modelDef = model.getModelDefinition();
String output = "Ext.define(\"" + modelName + "\","
+ StringUtilities.json(modelDef) + ");\n";
for (Association assoc : getAllAssociations(modelDef)) {
ModelDefinition associatedModel = assoc
.getAssociatedModelDefinition();
if (associatedModel == null) {
continue;
}
output += "Ext.define(\"" + assoc.getModelName() + "\","
+ StringUtilities.json(associatedModel) + ");\n";
}
writeScript(output);
}
/*
* Each of our associations need to have a model automatically generated
*/
private List<Association> getAllAssociations(
ModelDefinition baseModelDefinition) {
List<Association> allAssociations = new ArrayList<Association>();
for (Association assoc : baseModelDefinition.getAssociations()) {
allAssociations.add(assoc);
List<Association> thisAssociations = assoc
.getAssociatedModelDefinition().getAssociations();
if (thisAssociations.size() > 0) {
allAssociations.addAll(thisAssociations);
}
}
return allAssociations;
}
private String param(Map<String, Object> a, String p) {
return (String) a.get(p);
}
}