package fr.eyal.datalib.generator; import java.io.IOException; import java.math.BigInteger; import java.util.ArrayList; import java.util.Collections; import java.util.Map; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.xmi.XMIResource; import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; import fr.eyal.datalib.generator.acceleo.common.Main; import fr.eyal.lib.datalib.genmodel.android.datalib.DataLibProject; import fr.eyal.lib.datalib.genmodel.android.datalib.DatalibFactory; import fr.eyal.lib.datalib.genmodel.android.datalib.DatalibPackage; import fr.eyal.lib.datalib.genmodel.android.datalib.WebService; import fr.eyal.lib.datalib.genmodel.android.datalib.content.DataLibOption; import fr.eyal.lib.datalib.genmodel.android.datalib.content.HttpMethod; import fr.eyal.lib.datalib.genmodel.android.datalib.content.ParameterType; import fr.eyal.lib.datalib.genmodel.android.datalib.content.ParseType; import fr.eyal.lib.datalib.genmodel.android.datalib.model.BusinessObject; import fr.eyal.lib.datalib.genmodel.android.datalib.model.BusinessObjectDAO; import fr.eyal.lib.datalib.genmodel.android.datalib.model.Field; import fr.eyal.lib.datalib.genmodel.android.datalib.model.FieldBusinessObject; import fr.eyal.lib.datalib.genmodel.android.datalib.model.ModelFactory; import fr.eyal.lib.datalib.genmodel.android.datalib.model.ModelPackage; import fr.eyal.lib.datalib.genmodel.android.datalib.model.Parameter; import fr.eyal.lib.datalib.genmodel.android.datalib.model.ResponseBusinessObject; import fr.eyal.lib.datalib.genmodel.android.datalib.model.ResponseBusinessObjectDAO; public class DataLibGenerator { public static final String MODEL_EXTENSION = "xmi"; public static final String SCHEMA_LOCATION = "http://www.eyal.fr/android/datalib datalib.ecore#//datalib http://www.eyal.fr/datalib/android/model datalib.ecore#//datalib/model"; public static final String OPTION_SCHEMA_LOCATION = "SCHEMA_LOCATION"; /** * @param args */ public static void main(String[] args) { System.out.println("Initialization of the project"); String modelPath = "model/project." + MODEL_EXTENSION; if(args.length < 2) throw new IllegalArgumentException("The number of arguments have to be equal to 2. Input path, then, folder path"); String inputPath = args[0]; String folderPath = args[1]; //"src-gen"; System.out.println("Ressource path: " + inputPath); System.out.println("Target folder: " + folderPath); try{ //we create the XMI model content DataLibProject project = createXMI(modelPath, inputPath); //"model/apilogin.xml"); //"platform:/resource/DataLibGeneratorAcceleo/model/apilogin.xml"); String[] generationArgs = { folderPath }; System.out.println("Generation..."); //we start the generation Main.main(project, generationArgs); } catch (Exception e) { System.err.println("An Exception occured: " + e.getMessage() + ". \nSolve it to finish the generation"); } System.out.println("Generation done !"); } public static DataLibProject createXMI(String modelPath, String inputPath) { //initialize the model DatalibPackage.eINSTANCE.eClass(); ModelPackage.eINSTANCE.eClass(); System.out.println("Creation of the model..."); DataLibProject project = null; final SAXParserFactory saxFactory = SAXParserFactory.newInstance(); try { final SAXParser sp = saxFactory.newSAXParser(); DataLibGeneratorParser parser = new DataLibGeneratorParser(); System.out.println("start parsing input"); sp.parse(inputPath, parser); System.out.println("end parsing SAX"); project = parser.getParseResult(); } catch (final Exception e) { e.printStackTrace(); } System.out.println("Storing for backup"); // Register the XMI resource factory for the #MODEL_EXTENSION Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE; Map<String, Object> m = reg.getExtensionToFactoryMap(); m.put(MODEL_EXTENSION, new XMIResourceFactoryImpl()); // Obtain a new resource set ResourceSet resSet = new ResourceSetImpl(); resSet.getLoadOptions().put(XMIResource.OPTION_SCHEMA_LOCATION, true); // Create a resource URI uri = URI.createURI(modelPath); Resource resource = resSet.createResource(uri); //Get the first model element and cast it to the right type, in my //example everything is hierarchical included in this first node resource.getContents().add(project); //we save the content try { resource.save(Collections.EMPTY_MAP); } catch (IOException e) { e.printStackTrace(); } return project; } /* * CREATION TOOLS */ /** * Create a ResponseBusinessObject filled with the following parameters * * @param modelFactory * @param name name of the BusinessObject * @param packageName package name * @param parseId parse ID * @param xmlName XML name * @param parent the father BusinessObject * @param childs the child(s) BusinessObject * @param xmlAttributes XML attributes * @param attributes attributes * @param contentFields content fields * * @return the BusinessObject */ public static ResponseBusinessObject createResponseBusinessObject(ModelFactory modelFactory, String name, String packageName, BigInteger parseId, String xmlName, String javaName, String javaTag, BusinessObject parent, ArrayList<BusinessObject> childs, ArrayList<Field> attributes, ArrayList<Field> contentFields) { ResponseBusinessObject responseBusinessObject = modelFactory.createResponseBusinessObject(); //we fill the BusinessObject fillBusinessObject(responseBusinessObject, name, packageName, parseId, xmlName, javaName, javaTag, parent, childs, attributes, contentFields); return responseBusinessObject; } /** * @param modelFactory */ public static BusinessObject createBusinessObject(ModelFactory modelFactory, String name, String packageName, BigInteger parseId, String xmlName, String javaName, String javaTag, BusinessObject parent, ArrayList<BusinessObject> childs, ArrayList<Field> attributes, ArrayList<Field> contentFields) { BusinessObject businessObject = modelFactory.createBusinessObject(); //we fill the BusinessObject fillBusinessObject(businessObject, name, packageName, parseId, xmlName, javaName, javaTag, parent, childs, attributes, contentFields); return businessObject; } /** * @param modelFactory */ public static BusinessObjectDAO createBusinessObjectDAO(ModelFactory modelFactory, String name, String packageName, BigInteger parseId, String xmlName, String javaName, String javaTag, BusinessObject parent, ArrayList<BusinessObject> childs, ArrayList<Field> attributes, ArrayList<Field> contentFields, DataLibProject project) { BusinessObjectDAO businessObject = modelFactory.createBusinessObjectDAO(); //we fill the BusinessObject fillBusinessObjectDAO(businessObject, name, packageName, parseId, xmlName, javaName, javaTag, parent, childs, attributes, contentFields, project); return businessObject; } /** * @param modelFactory */ public static ResponseBusinessObjectDAO createResponseBusinessObjectDAO(ModelFactory modelFactory, String name, String packageName, BigInteger parseId, String xmlName, String javaName, String javaTag, BusinessObject parent, ArrayList<BusinessObject> childs, ArrayList<Field> attributes, ArrayList<Field> contentFields, DataLibProject project) { ResponseBusinessObjectDAO businessObject = modelFactory.createResponseBusinessObjectDAO(); //we fill the BusinessObject fillBusinessObjectDAO(businessObject, name, packageName, parseId, xmlName, javaName, javaTag, parent, childs, attributes, contentFields, project); return businessObject; } /** * @param businessObject * @param name * @param packageName * @param parseId * @param xmlName * @param parent * @param childs * @param xmlAttributes * @param attributes * @param contentFields * @param project */ public static void fillBusinessObjectDAO(BusinessObjectDAO businessObject, String name, String packageName, BigInteger parseId, String xmlName, String javaName, String javaTag, BusinessObject parent, ArrayList<BusinessObject> childs, ArrayList<Field> attributes, ArrayList<Field> contentFields, DataLibProject project) { fillBusinessObject(businessObject, name, packageName, parseId, xmlName, javaName, javaTag, parent, childs, attributes, contentFields); businessObject.setProject(project); } /** * @param businessObject * @param name * @param packageName * @param parseId * @param xmlName * @param parent * @param childs * @param xmlAttributes * @param attributes * @param contentFields */ public static void fillBusinessObject(BusinessObject businessObject, String name, String packageName, BigInteger parseId, String xmlName, String javaName, String javaTag, BusinessObject parent, ArrayList<BusinessObject> childs, ArrayList<Field> attributes, ArrayList<Field> contentFields) { businessObject.setName(name); businessObject.setPackage(packageName); businessObject.setParseId(parseId); businessObject.setXmlName(xmlName); businessObject.setJavaName(javaName); businessObject.setJavaTag(javaTag); businessObject.setParent(parent); if(childs != null) businessObject.getChilds().addAll(childs); if(attributes != null) businessObject.getAttributes().addAll(attributes); // if(xmlAttributes != null) businessObject.getXmlAttributes().addAll(xmlAttributes); if(contentFields != null) businessObject.getContentFields().addAll(contentFields); } /** * @param modelFactory * @param name * @param type * @param description * @return */ public static Parameter createParameter(ModelFactory modelFactory, String name, ParameterType type, String description, int urlParam, boolean fingerprintKey){ Parameter parameter = modelFactory.createParameter(); fillParameter(parameter, name, type, description); parameter.setUrlParameter(urlParam); parameter.setFingerprintKey(fingerprintKey); return parameter; } /** * @param modelFactory * @param name * @param type * @param description * @return */ public static Field createField(ModelFactory modelFactory, String name, ParameterType type, String description, String defaultValue, String xmlName, String javaName, String javaTag, BigInteger parseId, ArrayList<Field> xmlAttributes, BusinessObject businessObject, ArrayList<Field> xmlContentFields){ Field field = modelFactory.createField(); fillParameter(field, name, type, description); field.setDefaultValue(defaultValue); field.setXmlName(xmlName); field.setJavaName(javaName); field.setJavaTag(javaTag); field.setParseId(parseId); field.setBusinessObject(businessObject); if(xmlAttributes != null) field.getXmlAttributes().addAll(xmlAttributes); if(xmlContentFields != null) field.getXmlContentFields().addAll(xmlContentFields); return field; } /** * Create a {@link FieldBusinessObject} * * @param modelFactory * @param name * @param type * @param description * @param defaultValue * @param xmlName * @param parseId * @param xmlAttributes * @param businessObject * @param xmlContentFields * @param content * @return */ public static FieldBusinessObject createFieldBusinessObject(ModelFactory modelFactory, String name, ParameterType type, String description, String defaultValue, String xmlName, String javaName, String javaTag, BigInteger parseId, ArrayList<Field> xmlAttributes, BusinessObject businessObject, ArrayList<Field> xmlContentFields, BusinessObject content, Field xmlParent){ FieldBusinessObject field = modelFactory.createFieldBusinessObject(); fillParameter(field, name, type, description); field.setDefaultValue(defaultValue); field.setXmlName(xmlName); field.setParseId(parseId); field.setBusinessObject(businessObject); field.setJavaName(javaName); field.setJavaTag(javaTag); if(xmlAttributes != null) field.getXmlAttributes().addAll(xmlAttributes); if(xmlContentFields != null) field.getXmlContentFields().addAll(xmlContentFields); field.setContent(content); field.setXmlParent(xmlParent); return field; } /** * @param name * @param type * @param description * @param parameter */ public static void fillParameter(Parameter parameter, String name, ParameterType type, String description) { parameter.setName(name); parameter.setType(type); parameter.setDescription(description); parameter.setFingerprintKey(true); } /** * @param factory * @param project * @param contentResponse * @param cached * @param method * @param name * @param packageName * @param parseType * @param url * @param options * @param parameters * @return */ public static WebService createWebservice(DatalibFactory factory, DataLibProject project, ResponseBusinessObject contentResponse, boolean cached, HttpMethod method, String name, String packageName, ParseType parseType, String url, ArrayList<DataLibOption> options, ArrayList<Parameter> parameters) { WebService webService1 = factory.createWebService(); fillWebService(contentResponse, cached, method, name, packageName, parseType, url, options, parameters, webService1); project.getWebservices().add(webService1); return webService1; } /** * @param contentResponse * @param cached * @param method * @param name * @param packageName * @param parseType * @param url * @param options * @param parameters * @param webService */ public static void fillWebService(ResponseBusinessObject contentResponse, boolean cached, HttpMethod method, String name, String packageName, ParseType parseType, String url, ArrayList<DataLibOption> options, ArrayList<Parameter> parameters, WebService webService) { webService.setCached(cached); webService.setMethod(method); webService.setName(name); webService.setPackage(packageName); webService.setParseType(parseType); webService.setUrl(url); webService.setContentResponse(contentResponse); if(options != null) webService.getOptions().addAll(options); if(parameters != null) webService.getParameters().addAll(parameters); } /** * @param factory * @param authority * @param databaseName * @param databaseVersion * @param name * @param packageName * @return */ public static DataLibProject createProject(DatalibFactory factory, String authority, String databaseName, String databaseVersion, String name, String packageName) { DataLibProject project = factory.createDataLibProject(); project.setAuthority(authority); project.setDatabaseName(databaseName); project.setDatabaseVersion(databaseVersion); project.setName(name); project.setPackage(packageName); return project; } }