1 17 package org.eclipse.emf.importer.rose; 18 19 import java.io.File ; 20 import java.util.HashMap ; 21 import java.util.Iterator ; 22 import java.util.List ; 23 import java.util.Map ; 24 25 import org.eclipse.core.runtime.IPath; 26 import org.eclipse.core.runtime.IProgressMonitor; 27 import org.eclipse.core.runtime.Path; 28 import org.eclipse.core.runtime.SubProgressMonitor; 29 30 import org.eclipse.emf.common.util.URI; 31 import org.eclipse.emf.ecore.EPackage; 32 import org.eclipse.emf.importer.ModelImporter; 33 import org.eclipse.emf.importer.ModelImporterApplication; 34 35 36 public class RoseImporterApplication extends ModelImporterApplication 37 { 38 public static class PackageInfo 39 { 40 public String name; 41 public String nsPrefix; 42 public String nsURI; 43 public String base; 44 public String prefix; 45 } 46 47 protected IPath roseModelFullPath; 48 protected IPath genModelFullPath; 49 50 protected boolean noQualify; 51 protected boolean unsettablePrimitive; 52 protected Map pathMap; 53 protected Map nameToPackageInfo; 54 protected Map nameToReferencedPackageInfo; 55 56 public RoseImporter getRoseImporter() 57 { 58 return (RoseImporter)getModelImporter(); 59 } 60 61 protected ModelImporter createModelImporter() 62 { 63 return new RoseImporter(); 64 } 65 66 protected StringBuffer getUsage() 67 { 68 StringBuffer result = new StringBuffer (); 69 appendLine(result, "Usage: <model.mdl> [ <model.genmodel> [ -reload ] ] <OPTION>"); 70 appendLine(result, "<OPTION> ::= [ <PROJECT-OPTION> ] [ <PATHMAP> ]"); 71 appendLine(result, " { <PACKAGE> }+ { <REF-PACKAGE> }* { <REF-GEN-MODEL> }*"); 72 appendLine(result, " [ <TEMPLATE-PATH> ] [ <MODEL-PLUGIN-ID> ] [ <COPYRIGHT> ]"); 73 appendLine(result, " [ <SDO> ] [ <QUIET> ]"); 74 appendLine(result, "<PROJECT-OPTION> ::= <MODEL-PROJECT> [ <EDIT-PROJECT> ] [ <EDITOR-PROJECT> ]"); 75 appendLine(result, " [ <TESTS-PROJECT> ]"); 76 appendLine(result, "<MODEL-PROJECT> ::= -modelProject <model-directory> <fragment-path>"); 77 appendLine(result, "<EDIT-PROJECT> ::= -editProject <edit-directory> <fragment-path>"); 78 appendLine(result, "<EDITOR-PROJECT> ::= -editorProject <editor-directory> <fragment-path>"); 79 appendLine(result, "<TESTS-PROJECT> ::= -testsProject <tests-directory> <fragment-path>"); 80 appendLine(result, "<PATHMAP> ::= -pathMap { <symbol> <directory> }+"); 81 appendLine(result, "<PACKAGE> ::= -package <name> [ <nsPrefix> <nsURI> <base> <prefix> ]"); 82 appendLine(result, "<REF-PACKAGE> ::= -refPackage <name> [ <nsPrefix> <nsURI> <base> <prefix> ]"); 83 appendLine(result, "<REF-GEN-MODEL> ::= -refGenModel <model.genmodel> { <nsURI> }+"); 84 appendLine(result, "<TEMPLATE-PATH> ::= -templatePath <template-directory>"); 85 appendLine(result, "<MODEL-PLUGIN-ID> ::= -modelPluginID <plugin-ID>"); 86 appendLine(result, "<COPYRIGHT> ::= -copyright <copyright-string>"); 87 appendLine(result, "<SDO> ::= -sdo"); 88 appendLine(result, "<QUIET> ::= -quiet"); 89 appendLine(result, ""); 90 appendLine(result, "For example:"); 91 appendLine(result, ""); 92 appendLine(result, ""); 93 appendLine(result, " rose2genmodel"); 94 appendLine(result, " ../../etools.company/src/rose/model.mdl"); 95 appendLine(result, " result/model/Extended.genmodel"); 96 appendLine(result, " -modelProject result src"); 97 appendLine(result, " -editProject result.edit src"); 98 appendLine(result, " -editorProject result.editor src"); 99 appendLine(result, " -pathMap VABASE_PLUGINS_PATH C:/sandbox/unpackage2/eclipse/plugins"); 100 appendLine(result, " -package extended Extended Extended.ecore org.example Extended"); 101 appendLine(result, " -refPackage company Company Company.ecore org.sample Company"); 102 return result; 103 } 104 105 protected void processArguments(String [] arguments, int index) 106 { 107 roseModelFullPath = new Path(new File (arguments[index++]).getAbsolutePath()); 108 109 String nextArgument = index < arguments.length ? arguments[index++] : null; 110 genModelFullPath = nextArgument != null && !nextArgument.startsWith("-") ? 111 new Path(new File (nextArgument).getAbsolutePath()) : 112 roseModelFullPath.removeFileExtension().addFileExtension("genmodel"); 113 114 super.processArguments(arguments, index); 115 } 116 117 protected int processArgument(String [] arguments, int index) 118 { 119 if (arguments[index].equalsIgnoreCase("-pathmap")) 120 { 121 if (pathMap == null) 122 { 123 pathMap = new HashMap (); 124 } 125 do 126 { 127 String variable = arguments[++index]; 128 String directory = arguments[++index]; 129 pathMap.put(variable, directory); 130 } 131 while (index + 1 < arguments.length && !arguments[index + 1].startsWith("-")); 132 } 133 else if (arguments[index].equalsIgnoreCase("-package")) 134 { 135 if (nameToPackageInfo == null) 136 { 137 nameToPackageInfo = new HashMap (); 138 } 139 index = processPackageInformation(arguments, index, nameToPackageInfo); 140 } 141 else if (arguments[index].equalsIgnoreCase("-refPackage")) 142 { 143 System.out.println("**** Instead of -refPackage you should be using -refGenModel"); 144 145 if (nameToReferencedPackageInfo == null) 146 { 147 nameToReferencedPackageInfo = new HashMap (); 148 } 149 index = processPackageInformation(arguments, index, nameToReferencedPackageInfo); 150 } 151 else if (arguments[index].equalsIgnoreCase("-unsettablePrimitive")) 152 { 153 unsettablePrimitive = true; 154 } 155 else if (arguments[index].equalsIgnoreCase("-noQualify")) 156 { 157 noQualify = true; 158 } 159 else 160 { 161 return super.processArgument(arguments, index); 162 } 163 return index + 1; 164 } 165 166 protected int processPackageInformation(String [] arguments, int index, Map nameToPackageInfo) 167 { 168 int start = index; 169 PackageInfo packageInfo = new PackageInfo(); 170 if (index + 1 < arguments.length && !arguments[index + 1].startsWith("-")) 171 { 172 packageInfo.name = arguments[++index]; 173 if (index + 1 < arguments.length && !arguments[index + 1].startsWith("-")) 174 { 175 packageInfo.nsPrefix = arguments[++index]; 176 if (index + 1 < arguments.length && !arguments[index + 1].startsWith("-")) 177 { 178 packageInfo.nsURI = arguments[++index]; 179 if (index + 1 < arguments.length && !arguments[index + 1].startsWith("-")) 180 { 181 packageInfo.base = arguments[++index]; 182 if (index + 1 < arguments.length && !arguments[index + 1].startsWith("-")) 183 { 184 packageInfo.prefix = arguments[++index]; 185 } 186 } 187 } 188 } 189 if (index - start != 1 && index - start != 5) 190 { 191 throw new IllegalArgumentException ("Error: Expecting either 1 or 5 arguments for " + arguments[start]); 192 } 193 else 194 { 195 nameToPackageInfo.put(packageInfo.name, packageInfo); 196 nameToPackageInfo.put(packageInfo.name.toLowerCase(), packageInfo); 197 return index; 198 } 199 } 200 else 201 { 202 throw new IllegalArgumentException ("Error: No package name was specified for " + arguments[start]); 203 } 204 } 205 206 protected void adjustModelImporter(IProgressMonitor progressMonitor) 207 { 208 try 209 { 210 progressMonitor.beginTask("", 2); 211 212 super.adjustModelImporter(new SubProgressMonitor(progressMonitor, 1)); 213 RoseImporter roseImporter = getRoseImporter(); 214 handleGenModelPath(genModelFullPath); 215 roseImporter.setModelLocation(URI.createFileURI(roseModelFullPath.toOSString()).toString()); 216 217 if (pathMap != null) 218 { 219 roseImporter.getPathMap().putAll(pathMap); 220 } 221 roseImporter.setNoQualify(noQualify); 222 roseImporter.setUnsettablePrimitive(unsettablePrimitive); 223 } 224 finally 225 { 226 progressMonitor.done(); 227 } 228 } 229 230 protected void adjustEPackages(IProgressMonitor progressMonitor) 231 { 232 try 233 { 234 progressMonitor.beginTask("", 2); 235 super.adjustEPackages(new SubProgressMonitor(progressMonitor, 1)); 236 237 List ePackages = getRoseImporter().getEPackages(); 238 traverseEPackages(ePackages); 239 getRoseImporter().adjustEPackages(new SubProgressMonitor(progressMonitor, 1)); 240 } 241 finally 242 { 243 progressMonitor.done(); 244 } 245 } 246 247 protected void traverseEPackages(List ePackages) 248 { 249 for (Iterator i = ePackages.iterator(); i.hasNext();) 250 { 251 EPackage ePackage = (EPackage)i.next(); 252 String packageName = ePackage.getName(); 253 254 boolean isReferencedEPackage = false; 255 PackageInfo packageInfo = nameToPackageInfo == null ? null : 256 (PackageInfo)nameToPackageInfo.get(packageName); 257 if (packageInfo == null && nameToReferencedPackageInfo != null) 258 { 259 packageInfo = (PackageInfo)nameToReferencedPackageInfo.get(packageName); 260 isReferencedEPackage = packageInfo != null; 261 } 262 263 if (packageInfo != null || nameToPackageInfo == null) 264 { 265 handleEPackage(ePackage, !isReferencedEPackage); 266 } 267 268 if (packageInfo != null) 269 { 270 if (!getRoseImporter().hasRoseGenPackageProperties(ePackage)) 271 { 272 ePackage.setNsPrefix(packageInfo.nsPrefix); 273 ePackage.setNsURI(packageInfo.nsURI); 274 } 275 276 ModelImporter.EPackageInfo ePackageInfo = getRoseImporter().getEPackageInfo(ePackage); 277 if (ePackageInfo.getBasePackage() == null) 278 { 279 ePackageInfo.setBasePackage(packageInfo.base); 280 } 281 if (ePackageInfo.getPrefix() == null) 282 { 283 ePackageInfo.setPrefix(packageInfo.prefix); 284 } 285 } 286 287 handleQualifiedEPackageName(ePackage); 288 traverseEPackages(ePackage.getESubpackages()); 289 } 290 } 291 } 292 | Popular Tags |