Skip to content
This repository has been archived by the owner on Nov 27, 2023. It is now read-only.

Commit

Permalink
Merge remote-tracking branch 'origin/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
enstulen committed Nov 22, 2019
2 parents 221c066 + 4bdf248 commit f2bf005
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
mysite.no:
root: "/var/www/mysite.no/html"
INCLUDE "default.nginx"

mysite.no from site.no:
root: "/var/www"
https_redirect: true
index: "index.html"
template: php7.2
log_name: "default.log"
log_name: "mysite"
error_page: 404 "404.html"
error_page: 500 502 503 504 "/50x.html"
ssl_certificate: "/etc/cloudflare/mysite.no/certificate.pem"
ssl_certificate_key: "/etc/cloudflare/mysite.no/privkey.pem"
ssl_certificate_key: "/etc/cloudflare/mysite.cno/privkey.pem"
ssl_dhparam: "/etc/letsencrypt/ssl-dhparams.pem"
11 changes: 9 additions & 2 deletions no.ntnu.tdt4250.nginx.dsl/src/no/ntnu/tdt4250/Nginx.xtext
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,25 @@ import "http://www.eclipse.org/emf/2002/Ecore" as ecore
generate nginx "http://www.ntnu.no/tdt4250/Nginx"

Nginx:
includes+=Include* &
sites+=Site*;


SiteName returns ecore::EString: ID ('.' ID)*;
WildCardedSiteName returns ecore::EString: ('*.')? ID ('.' ID)* ('.*')?; // http://nginx.org/en/docs/http/server_names.html#wildcard_names

// TODO fix port and root??
Include:
'INCLUDE' importURI=STRING
;

// TODO add an include?
// TODO add reference in itself
// TODO maybe add location directive?
Site:
name=(SiteName|'default')
alternativeNames+=WildCardedSiteName* ':'
alternativeNames+=WildCardedSiteName*
('from' inherits=[Site | SiteName])?
':'
BEGIN
(
('index:' index=STRING)? &
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package no.ntnu.tdt4250

import com.google.common.base.Splitter
import com.google.inject.Inject
import com.google.inject.Provider
import java.util.LinkedHashSet
import org.eclipse.emf.common.util.URI
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.xtext.EcoreUtil2
import org.eclipse.xtext.resource.IResourceDescription
import org.eclipse.xtext.scoping.impl.ImportUriGlobalScopeProvider
import org.eclipse.xtext.util.IResourceScopeCache
import no.ntnu.tdt4250.nginx.NginxPackage

class NginxGlobalScopeProvider extends ImportUriGlobalScopeProvider {
static final Splitter SPLITTER = Splitter.on(',');

@Inject
IResourceDescription.Manager descriptionManager;

@Inject
IResourceScopeCache cache;

override protected getImportedUris(Resource resource) {
return cache.get(NginxGlobalScopeProvider.getSimpleName(), resource, new Provider<LinkedHashSet<URI>>() {
override get() {
val uniqueImportURIs = collectImportUris(resource, new LinkedHashSet<URI>(5))

val uriIter = uniqueImportURIs.iterator()
while(uriIter.hasNext()) {
if (!EcoreUtil2.isValidUri(resource, uriIter.next()))
uriIter.remove()
}
return uniqueImportURIs
}

def LinkedHashSet<URI> collectImportUris(Resource resource, LinkedHashSet<URI> uniqueImportURIs) {
val resourceDescription = descriptionManager.getResourceDescription(resource)
val models = resourceDescription.getExportedObjectsByType(NginxPackage.Literals.NGINX)

models.forEach[
val userData = getUserData(NginxResourceDescriptionStrategy.INCLUDES)
if(userData !== null) {
SPLITTER.split(userData).forEach[uri |
var includedUri = URI.createURI(uri)
includedUri = includedUri.resolve(resource.URI)
if(uniqueImportURIs.add(includedUri)) {
collectImportUris(resource.getResourceSet().getResource(includedUri, true), uniqueImportURIs)
}
]
}
]

return uniqueImportURIs
}
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package no.ntnu.tdt4250;

import com.google.inject.Inject
import java.util.HashMap
import org.eclipse.xtext.naming.QualifiedName
import org.eclipse.xtext.resource.EObjectDescription
import org.eclipse.xtext.resource.IEObjectDescription
import org.eclipse.xtext.resource.impl.DefaultResourceDescriptionStrategy
import org.eclipse.xtext.scoping.impl.ImportUriResolver
import org.eclipse.xtext.util.IAcceptor
import org.eclipse.emf.ecore.EObject
import no.ntnu.tdt4250.nginx.Nginx

class NginxResourceDescriptionStrategy extends DefaultResourceDescriptionStrategy {
public static final String INCLUDES = "includes"

@Inject
ImportUriResolver uriResolver

override createEObjectDescriptions(EObject eObject, IAcceptor<IEObjectDescription> acceptor) {
if(eObject instanceof Nginx) {
this.createEObjectDescriptionForModel(eObject, acceptor)
return true
}
else {
super.createEObjectDescriptions(eObject, acceptor)
}
}

def void createEObjectDescriptionForModel(Nginx model, IAcceptor<IEObjectDescription> acceptor) {
val uris = newArrayList()
model.includes.forEach[uris.add(uriResolver.apply(it))]
val userData = new HashMap<String,String>
userData.put(INCLUDES, uris.join(","))
acceptor.accept(EObjectDescription.create(QualifiedName.create(model.eResource.URI.toString), model, userData))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ package no.ntnu.tdt4250

import no.ntnu.tdt4250.converter.NginxValueConverter
import org.eclipse.xtext.conversion.IValueConverterService
import org.eclipse.xtext.resource.IDefaultResourceDescriptionStrategy
import org.eclipse.xtext.scoping.IGlobalScopeProvider

/**
* Use this class to register components to be used at runtime / without the Equinox extension registry.
Expand All @@ -14,5 +16,11 @@ class NginxRuntimeModule extends AbstractNginxRuntimeModule {
override Class<? extends IValueConverterService> bindIValueConverterService() {
return NginxValueConverter
}
def Class<? extends IDefaultResourceDescriptionStrategy> bindIDefaultResourceDescriptionStrategy() {
NginxResourceDescriptionStrategy
}
override Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
NginxGlobalScopeProvider;
}

}

0 comments on commit f2bf005

Please sign in to comment.