@@ -32,6 +32,10 @@ import org.eclipse.xtext.Grammar
3232
3333class ExportGeneratorX {
3434
35+ static val URI_PROJECT_SEGMENT_INDEX = 1
36+ static val URI_PACKAGE_START_INDEX = 3
37+ static val DEFAULT_PACKAGE_SEGMENT = " generated"
38+
3539 @Inject
3640 extension Naming
3741
@@ -51,49 +55,90 @@ class ExportGeneratorX {
5155 }
5256
5357 def String getExportedNamesProvider (ExportModel model ) {
54- val uri = model. eResource(). getURI();
5558 // TODO this is a hack; to support modularization we should probably add name to export models (as with scope models)
56- return String . join( " . " , uri . segmentsList() . subList( 3 , uri . segmentCount() - 1 )) + " .naming." + getName(model) + " ExportedNamesProvider" ;
59+ return model . basePackage + " .naming." + getName(model) + " ExportedNamesProvider" ;
5760 }
5861
5962 def String getResourceDescriptionManager (ExportModel model ) {
60- val uri = model. eResource(). getURI();
6163 // TODO this is a hack; to support modularization we should probably add name to export models (as with scope models)
62- return String . join( " . " , uri . segmentsList() . subList( 3 , uri . segmentCount() - 1 )) + " .resource." + getName(model) + " ResourceDescriptionManager" ;
64+ return model . basePackage + " .resource." + getName(model) + " ResourceDescriptionManager" ;
6365 }
6466
6567 def String getResourceDescriptionManager (Grammar grammar ) {
6668 return grammar. name. toJavaPackage + " .resource." + grammar. name. toSimpleName + " ResourceDescriptionManager" ;
6769 }
6870
6971 def String getResourceDescriptionStrategy (ExportModel model ) {
70- val uri = model. eResource(). getURI();
7172 // TODO this is a hack; to support modularization we should probably add name to export models (as with scope models)
72- return String . join( " . " , uri . segmentsList() . subList( 3 , uri . segmentCount() - 1 )) + " .resource." + getName(model) + " ResourceDescriptionStrategy" ;
73+ return model . basePackage + " .resource." + getName(model) + " ResourceDescriptionStrategy" ;
7374 }
7475
7576 def String getResourceDescriptionConstants (ExportModel model ) {
76- val uri = model. eResource(). getURI();
7777 // TODO this is a hack; to support modularization we should probably add name to export models (as with scope models)
78- return String . join( " . " , uri . segmentsList() . subList( 3 , uri . segmentCount() - 1 )) + " .resource." + getName(model) + " ResourceDescriptionConstants" ;
78+ return model . basePackage + " .resource." + getName(model) + " ResourceDescriptionConstants" ;
7979 }
8080
8181 def String getFingerprintComputer (ExportModel model ) {
82- val uri = model. eResource(). getURI();
8382 // TODO this is a hack; to support modularization we should probably add name to export models (as with scope models)
84- return String . join( " . " , uri . segmentsList() . subList( 3 , uri . segmentCount() - 1 )) + " .resource." + getName(model) + " FingerprintComputer" ;
83+ return model . basePackage + " .resource." + getName(model) + " FingerprintComputer" ;
8584 }
8685
8786 def String getFragmentProvider (ExportModel model ) {
88- val uri = model. eResource(). getURI();
8987 // TODO this is a hack; to support modularization we should probably add name to export models (as with scope models)
90- return String . join( " . " , uri . segmentsList() . subList( 3 , uri . segmentCount() - 1 )) + " .resource." + getName(model) + " FragmentProvider" ;
88+ return model . basePackage + " .resource." + getName(model) + " FragmentProvider" ;
9189 }
9290
9391 def String getExportFeatureExtension (ExportModel model ) {
94- val uri = model. eResource(). getURI();
9592 // TODO we still need to add a package to the models. Extension models already have a name in contrast to cases above
96- return String . join(" ." , uri. segmentsList(). subList(3 , uri. segmentCount() - 1 )) + " .resource." + model. name + " ExportFeatureExtension" ;
93+ return model. basePackage + " .resource." + model. name + " ExportFeatureExtension" ;
94+ }
95+
96+ private def String getBasePackage (ExportModel model ) {
97+ val uri = model.eResource. URI
98+ val packageFromUri = uri. packageFromUri
99+ if (packageFromUri !== null ) {
100+ return packageFromUri
101+ }
102+ return uri. fallbackPackage
103+ }
104+
105+ private def String getPackageFromUri (org.eclipse.emf.common.util. URI uri ) {
106+ val packageSegments = uri. segmentsList
107+ if (packageSegments. size > URI_PACKAGE_START_INDEX + 1 && " src" . equals(packageSegments. get(URI_PROJECT_SEGMENT_INDEX + 1 ))) {
108+ return String . join(" ." , packageSegments. subList(URI_PACKAGE_START_INDEX , uri. segmentCount - 1 ))
109+ }
110+ return null
111+ }
112+
113+ private def String getFallbackPackage (org.eclipse.emf.common.util. URI uri ) {
114+ val segments = uri. segmentsList
115+ if (segments. size > URI_PROJECT_SEGMENT_INDEX ) {
116+ return segments. get(URI_PROJECT_SEGMENT_INDEX ). safePackageSegment
117+ }
118+ return DEFAULT_PACKAGE_SEGMENT
119+ }
120+
121+ private def String getSafePackageSegment (String segment ) {
122+ if (segment == = null || segment. empty) {
123+ return DEFAULT_PACKAGE_SEGMENT
124+ }
125+ val normalizedSegment = segment. toLowerCase
126+ val builder = new StringBuilder ()
127+ for (var i = 0 ; i < normalizedSegment. length; i++ ) {
128+ val character = normalizedSegment. charAt(i)
129+ if (builder. length == 0 ) {
130+ if (Character . isJavaIdentifierStart(character)) {
131+ builder. append(character)
132+ } else if (Character . isJavaIdentifierPart(character)) {
133+ builder. append(' _' ). append(character)
134+ } else {
135+ builder. append(' _' )
136+ }
137+ } else {
138+ builder. append(if (Character . isJavaIdentifierPart(character)) character else ' _' )
139+ }
140+ }
141+ return if (builder. length == 0 ) DEFAULT_PACKAGE_SEGMENT else builder. toString
97142 }
98143
99144 /**
0 commit comments