/**
* <copyright>
*
* Copyright (c) 2005-2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*
* </copyright>
*
* $Id: RoseImporterApplication.java,v 1.23 2006/12/28 08:41:29 marcelop Exp $
*/
package com.sap.emf.importer.moin.rose;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.codegen.util.CodeGenUtil;
import org.eclipse.emf.common.util.Monitor;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.importer.ModelImporter;
import org.eclipse.emf.importer.ModelImporterApplication;
public class RoseImporterApplication extends ModelImporterApplication
{
public static class PackageInfo
{
public String name;
public String nsPrefix;
public String nsURI;
public String base;
public String prefix;
}
protected boolean noQualify;
protected boolean unsettablePrimitive;
protected Map<String, String> pathMap;
protected Map<String, PackageInfo> nameToPackageInfo;
protected Map<String, PackageInfo> nameToReferencedPackageInfo;
public RoseImporter getRoseImporter()
{
return (RoseImporter)getModelImporter();
}
@Override
protected ModelImporter createModelImporter()
{
return new RoseImporter();
}
@Override
protected StringBuffer getUsage()
{
StringBuffer result = new StringBuffer();
appendLine(result, "Usage: <model.mdl> [ <model.genmodel> [ -reload ] ] <OPTION>");
appendLine(result, "<OPTION> ::= [ <PROJECT-OPTION> ] [ <PATHMAP> ]");
appendLine(result, " { <PACKAGE> }+ { <REF-PACKAGE> }* { <REF-GEN-MODEL> }*");
appendLine(result, " [ <TEMPLATE-PATH> ] [ <MODEL-PLUGIN-ID> ] [ <COPYRIGHT> ]");
appendLine(result, " [ <SDO> ] [ <QUIET> ]");
appendLine(result, "<PROJECT-OPTION> ::= <MODEL-PROJECT> [ <EDIT-PROJECT> ] [ <EDITOR-PROJECT> ]");
appendLine(result, " [ <TESTS-PROJECT> ]");
appendLine(result, "<MODEL-PROJECT> ::= -modelProject <model-directory> <fragment-path>");
appendLine(result, "<EDIT-PROJECT> ::= -editProject <edit-directory> <fragment-path>");
appendLine(result, "<EDITOR-PROJECT> ::= -editorProject <editor-directory> <fragment-path>");
appendLine(result, "<TESTS-PROJECT> ::= -testsProject <tests-directory> <fragment-path>");
appendLine(result, "<PATHMAP> ::= -pathMap { <symbol> <directory> }+");
appendLine(result, "<PACKAGE> ::= -package <name> [ <nsPrefix> <nsURI> <base> <prefix> ]");
appendLine(result, "<REF-PACKAGE> ::= <deprecated - use -refGenModel instead> -refPackage <name> [ <nsPrefix> <nsURI> <base> <prefix> ]");
appendLine(result, "<REF-GEN-MODEL> ::= -refGenModel <model.genmodel> { <nsURI> }+");
appendLine(result, "<TEMPLATE-PATH> ::= -templatePath <template-directory>");
appendLine(result, "<MODEL-PLUGIN-ID> ::= -modelPluginID <plugin-ID>");
appendLine(result, "<COPYRIGHT> ::= -copyright <copyright-string>");
appendLine(result, "<JDK-LEVEL> ::= -jdkLevel <jdk level: 1.4 5.0 6.0>");
appendLine(result, "<VALIDATE-MODEL> ::= -validateModel <true|false>");
appendLine(result, "<SDO> ::= -sdo");
appendLine(result, "<QUIET> ::= -quiet");
appendLine(result, "");
appendLine(result, "For example:");
appendLine(result, "");
appendLine(result, "");
appendLine(result, " rose2genmodel");
appendLine(result, " ../../etools.company/src/rose/model.mdl");
appendLine(result, " result/model/Extended.genmodel");
appendLine(result, " -modelProject result src");
appendLine(result, " -editProject result.edit src");
appendLine(result, " -editorProject result.editor src");
appendLine(result, " -pathMap VABASE_PLUGINS_PATH C:/sandbox/unpackage2/eclipse/plugins");
appendLine(result, " -package extended Extended Extended.ecore org.example Extended");
appendLine(result, " -refPackage company Company Company.ecore org.sample Company");
return result;
}
@Override
protected int processArgument(String[] arguments, int index)
{
if (arguments[index].equalsIgnoreCase("-pathmap"))
{
if (pathMap == null)
{
pathMap = new HashMap<String, String>();
}
do
{
String variable = arguments[++index];
String directory = arguments[++index];
pathMap.put(variable, directory);
}
while (index + 1 < arguments.length && !arguments[index + 1].startsWith("-"));
}
else if (arguments[index].equalsIgnoreCase("-package"))
{
if (nameToPackageInfo == null)
{
nameToPackageInfo = new HashMap<String, PackageInfo>();
}
index = processPackageInformation(arguments, index, nameToPackageInfo);
}
else if (arguments[index].equalsIgnoreCase("-refPackage"))
{
System.out.println("**** Instead of -refPackage you should be using -refGenModel");
if (nameToReferencedPackageInfo == null)
{
nameToReferencedPackageInfo = new HashMap<String, PackageInfo>();
}
index = processPackageInformation(arguments, index, nameToReferencedPackageInfo);
}
else if (arguments[index].equalsIgnoreCase("-unsettablePrimitive"))
{
unsettablePrimitive = true;
}
else if (arguments[index].equalsIgnoreCase("-noQualify"))
{
noQualify = true;
}
else
{
return super.processArgument(arguments, index);
}
return index + 1;
}
protected int processPackageInformation(String[] arguments, int index, Map<String, PackageInfo> nameToPackageInfo)
{
int start = index;
PackageInfo packageInfo = new PackageInfo();
if (index + 1 < arguments.length && !arguments[index + 1].startsWith("-"))
{
packageInfo.name = arguments[++index];
if (index + 1 < arguments.length && !arguments[index + 1].startsWith("-"))
{
packageInfo.nsPrefix = arguments[++index];
if (index + 1 < arguments.length && !arguments[index + 1].startsWith("-"))
{
packageInfo.nsURI = arguments[++index];
if (index + 1 < arguments.length && !arguments[index + 1].startsWith("-"))
{
packageInfo.base = arguments[++index];
if (index + 1 < arguments.length && !arguments[index + 1].startsWith("-"))
{
packageInfo.prefix = arguments[++index];
}
}
}
}
if (index - start != 1 && index - start != 5)
{
throw new IllegalArgumentException("Error: Expecting either 1 or 5 arguments for " + arguments[start]);
}
else
{
nameToPackageInfo.put(packageInfo.name, packageInfo);
nameToPackageInfo.put(packageInfo.name.toLowerCase(), packageInfo);
return index;
}
}
else
{
throw new IllegalArgumentException("Error: No package name was specified for " + arguments[start]);
}
}
@Override
protected void adjustModelImporter(Monitor monitor)
{
try
{
monitor.beginTask("", 2);
super.adjustModelImporter(CodeGenUtil.createMonitor(monitor, 1));
RoseImporter roseImporter = getRoseImporter();
if (pathMap != null)
{
roseImporter.getPathMap().putAll(pathMap);
}
roseImporter.setNoQualify(noQualify);
roseImporter.setUnsettablePrimitive(unsettablePrimitive);
}
finally
{
monitor.done();
}
}
@Override
protected void adjustEPackages(Monitor monitor)
{
try
{
monitor.beginTask("", 2);
super.adjustEPackages(CodeGenUtil.createMonitor(monitor, 1));
List<EPackage> ePackages = getRoseImporter().getEPackages();
traverseEPackages(ePackages);
getRoseImporter().adjustEPackages(CodeGenUtil.createMonitor(monitor, 1));
}
finally
{
monitor.done();
}
}
protected void traverseEPackages(List<EPackage> ePackages)
{
for (EPackage ePackage : ePackages)
{
String packageName = ePackage.getName();
boolean isReferencedEPackage = false;
PackageInfo packageInfo = nameToPackageInfo == null ? null :
(PackageInfo)nameToPackageInfo.get(packageName);
if (packageInfo == null && nameToReferencedPackageInfo != null)
{
packageInfo = nameToReferencedPackageInfo.get(packageName);
isReferencedEPackage = packageInfo != null;
}
if (packageInfo != null || nameToPackageInfo == null)
{
handleEPackage(ePackage, !isReferencedEPackage);
}
if (packageInfo != null)
{
if (!getRoseImporter().hasRoseGenPackageProperties(ePackage))
{
ePackage.setNsPrefix(packageInfo.nsPrefix);
ePackage.setNsURI(packageInfo.nsURI);
}
ModelImporter.EPackageImportInfo ePackageInfo = getRoseImporter().getEPackageImportInfo(ePackage);
if (ePackageInfo.getBasePackage() == null)
{
ePackageInfo.setBasePackage(packageInfo.base);
}
if (ePackageInfo.getPrefix() == null)
{
ePackageInfo.setPrefix(packageInfo.prefix);
}
}
handleQualifiedEPackageName(ePackage);
traverseEPackages(ePackage.getESubpackages());
}
}
}