All Downloads are FREE. Search and download functionalities are using the official Maven repository.

se.javasoft.generated.framework.development.meta.parser.ModelParser Maven / Gradle / Ivy

The newest version!
/**
* 	Warning!
*
* 	Generated source file. Changes in this file will be overwritten 
*	next time a generation is performed 
*
**/

package se.javasoft.generated.framework.development.meta.parser;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import se.javasoft.framework.development.meta.model.IApplication;
import se.javasoft.framework.development.meta.model.IModel;
import se.javasoft.framework.development.meta.model.IModelDatatype;
import se.javasoft.framework.development.meta.model.IModelGroup;
import se.javasoft.generated.framework.development.meta.model.IGenerate;
import se.javasoft.generated.framework.development.meta.model.impl.ModelRegistry;

import se.javasoft.generated.framework.development.meta.model.impl.DatatypeString;
import se.javasoft.generated.framework.development.meta.model.impl.DatatypeText;
import se.javasoft.generated.framework.development.meta.model.impl.DatatypeTimestamp;
import se.javasoft.generated.framework.development.meta.model.impl.DatatypeBoolean;
import se.javasoft.generated.framework.development.meta.model.impl.DatatypeInteger;
import se.javasoft.generated.framework.development.meta.model.impl.DatatypeDouble;
import se.javasoft.generated.framework.development.meta.model.impl.DatatypeSelectone;
import se.javasoft.generated.framework.development.meta.model.impl.DatatypeList;
import se.javasoft.generated.framework.development.meta.model.impl.DatatypeSet;

public abstract class ModelParser extends AbstractMojo implements IGenerate {
	private enum TYPE {NULL, APPLICATION, MODEL, MODELGROUP, MODELDATATYPE};
      
  @Override
  public void execute() throws MojoExecutionException, MojoFailureException {
    try {
      ModelHandler modelHandler = new ModelHandler();
      SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
      parser.parse(getModelFile(), modelHandler);
      
      StringBuffer result = new StringBuffer();
      IApplication application = modelHandler.getApplication();
            
	      startApplicationApplication(application, result);
	      
	      Collection models = application.getModels();
	      for(IModel model : models) {
			      startModelModel(model, result);
		        
		        Collection modelGroups = model.getModelGroups();
		        for(IModelGroup modelGroup : modelGroups) {
			          startModelGroupModelgroup(modelGroup, result);
			          
			          Collection modelDatatypes = modelGroup.getModelDatatypes();
			          for(IModelDatatype modelDatatype : modelDatatypes) {
			          	handleDatatype(modelGroup, modelDatatype, result);
			          }
			          
			          endModelGroupModelgroup(modelGroup, result);
		        }
		        
		        endModelModel(model, result);
	      }
	      endApplicationApplication(application, result);
    		writeResult(result);
    		writeFactoryPropertyFile();
    } catch (Exception e) {
      throw new MojoExecutionException(e.getMessage(), e);
    }
  }	
		
	public void handleDatatype(IModelGroup modelGroup, IModelDatatype modelDatatype, StringBuffer result) throws Exception {
		modelDatatype(modelDatatype, result);
		if (modelDatatype instanceof DatatypeString) {
			modelDatatypeString(modelGroup, (DatatypeString) modelDatatype, result);
		}
		if (modelDatatype instanceof DatatypeText) {
			modelDatatypeText(modelGroup, (DatatypeText) modelDatatype, result);
		}
		if (modelDatatype instanceof DatatypeTimestamp) {
			modelDatatypeTimestamp(modelGroup, (DatatypeTimestamp) modelDatatype, result);
		}
		if (modelDatatype instanceof DatatypeBoolean) {
			modelDatatypeBoolean(modelGroup, (DatatypeBoolean) modelDatatype, result);
		}
		if (modelDatatype instanceof DatatypeInteger) {
			modelDatatypeInteger(modelGroup, (DatatypeInteger) modelDatatype, result);
		}
		if (modelDatatype instanceof DatatypeDouble) {
			modelDatatypeDouble(modelGroup, (DatatypeDouble) modelDatatype, result);
		}
		if (modelDatatype instanceof DatatypeSelectone) {
			modelDatatypeSelectone(modelGroup, (DatatypeSelectone) modelDatatype, result);
		}
		if (modelDatatype instanceof DatatypeList) {
			modelDatatypeList(modelGroup, (DatatypeList) modelDatatype, result);
		}
		if (modelDatatype instanceof DatatypeSet) {
			modelDatatypeSet(modelGroup, (DatatypeSet) modelDatatype, result);
		}
	}	
	
	protected abstract File getModelFile();
  protected abstract void writeResult(StringBuffer result);
  
  class ModelHandler extends DefaultHandler {
    private TYPE type = TYPE.NULL;
    private IApplication application;
    private IModel model = null;
    private IModelGroup modelGroup = null;
    private IModelDatatype modelDatatype = null;
    
    public IApplication getApplication() {
      return application;
    }
    
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
      try {
        if (qName.equals("application")) {
          type = TYPE.APPLICATION;
          application = ModelRegistry.getFactory().getApplication(qName, attributes);
        } else if (type.equals(TYPE.APPLICATION)) {
          type = TYPE.MODEL;
          model = ModelRegistry.getFactory().getModel(qName, attributes);
          application.addModel(model);
        } else if (type.equals(TYPE.MODEL)) {
          type = TYPE.MODELGROUP;
          modelGroup = ModelRegistry.getFactory().getModelGroup(qName, attributes);
          model.addModelGroup(modelGroup);
        } else if (type.equals(TYPE.MODELGROUP)) {
          type = TYPE.MODELDATATYPE;
          modelDatatype = ModelRegistry.getFactory().getModelDatatype(qName, attributes);
          modelGroup.addModelDatatype(modelDatatype);
        }
      } catch (Exception e) {
        throw new SAXException(e);
      }
    }
    
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
      if (type.equals(TYPE.APPLICATION)) {
        type = TYPE.NULL;
      } else if (type.equals(TYPE.MODEL)) {
        type = TYPE.APPLICATION;
      } else if (type.equals(TYPE.MODELGROUP)) {
        type = TYPE.MODEL;
      } else if (type.equals(TYPE.MODELDATATYPE)) {
        type = TYPE.MODELGROUP;
      }
    }
  }  
  
  protected void updateProperties(File propertiesFile, String key, String value) throws MojoExecutionException {
	try {
				Properties properties = new Properties() {
				private static final long serialVersionUID = 1L;

				@Override
				public synchronized Enumeration keys() {
					Enumeration keysEnum = super.keys();
					Vector keyList = new Vector();
					Vector keySortList = new Vector();
					while (keysEnum.hasMoreElements()) {
						keySortList.add(keysEnum.nextElement().toString());
					}
					Collections.sort(keySortList);
					
					for (String string : keySortList) {
						keyList.add(string);
					}
					return keyList.elements();
				}
			};
			
			if (propertiesFile.exists()) {
				FileInputStream fis = new FileInputStream(propertiesFile);
				properties.load(fis);
			}

			if (properties.getProperty(key) == null) {
				propertiesFile.getParentFile().mkdirs();
				FileOutputStream fos = new FileOutputStream(propertiesFile);
				properties.put(key, value);
				properties.store(fos, "");
			}
		} catch (Exception ex) {
			throw new MojoExecutionException(ex.getMessage());
		}
	}
}