blob: 32d1214444fd33ac47e4943840ca63cf58f09deb [file] [log] [blame]
/**
* Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
* 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:
* Florian Pirchner - Initial implementation
*/
package org.eclipse.osbp.dsl.services.xtext.generator
import com.google.inject.Inject
import org.eclipse.xtext.naming.IQualifiedNameProvider
import org.eclipse.osbp.dsl.dto.xtext.extensions.MethodNamingExtensions
import org.eclipse.osbp.dsl.semantic.service.LCardinality
import org.eclipse.osbp.dsl.semantic.service.LDTOService
import org.eclipse.osbp.dsl.semantic.service.LService
class ComponentGenerator {
@Inject extension MethodNamingExtensions
@Inject extension IQualifiedNameProvider
def dispatch getServiceContent(LDTOService service) '''
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="«service.fullyQualifiedName.toLowerCase»">
<implementation class="«service.fullyQualifiedName»"/>
<service>
<provide interface="org.eclipse.osbp.dsl.dto.lib.services.IDTOService"/>
</service>
<property name="dto" type="String" value="«service.dto.fullyQualifiedName.toString»"/>
<property name="service.pid" type="String" value="«service.fullyQualifiedName.toLowerCase»"/>
«IF service.injectedServices != null && !service.injectedServices.services.empty»
«FOR ref : service.injectedServices.services»
<reference name="«ref.attributeName.toFirstLower»" interface="«ref.service.type?.qualifiedName.toString»"
cardinality="«ref.cardinality.cardinalityString»" policy="dynamic" bind="bind«ref.attributeName.
toFirstUpper»" unbind="unbind«ref.attributeName.toFirstUpper»/>
«ENDFOR»
«ELSE»
«IF !service.mutablePersistenceId»
<reference name="emf" interface="javax.persistence.EntityManagerFactory" cardinality="1..1"
policy="dynamic" bind="bindEmf" unbind="unbindEmf" «IF (service.persistenceId != null &&
!service.persistenceId.equals(""))»target="(osgi.unit.name=«service.persistenceId»)"«ENDIF»/>
«ENDIF»
<reference name="mapperAccess" interface="org.eclipse.osbp.dsl.dto.lib.IMapperAccess" cardinality="1..1"
policy="dynamic" bind="bindMapperAccess" unbind="unbindMapperAccess"/>
<reference name="filterEnhancers" interface="org.eclipse.osbp.dsl.dto.lib.services.filters.IFilterEnhancer" cardinality="0..n"
policy="dynamic" bind="addFilterEnhancer" unbind="removeFilterEnhancer"/>
«IF !service.validators.empty»
<reference name="validators" interface="org.eclipse.osbp.runtime.common.validation.IValidationParticipant" cardinality="0..n"
policy="dynamic" target="«service.toValidatorTarget»" bind="addValidationParticipant" unbind="removeValidationParticipant"/>
«ENDIF»
«ENDIF»
</scr:component>
'''
def String toValidatorTarget(LDTOService service) {
// create following target: target="(|(val=a)(val=b)(val=c)(val=d))"
val StringBuilder b = new StringBuilder
for (validator : service.validators) {
var String id = null
if (validator.validatorType != null) {
id = validator.validatorType.qualifiedName
} else {
id = validator.validatorId
}
b.append("(component.name=")
b.append(id)
b.append(")")
}
return if(service.validators.length == 1) b.toString else String.format("(|%s)", b.toString)
}
def String cardinalityString(LCardinality cardinality) {
switch (cardinality) {
case ZERO_TO_ONE:
return "0..1"
case ZERO_TO_MANY:
return "0..n"
case ONE_TO_ONE:
return "1..1"
case ONE_TO_MANY:
return "1..n"
default:
return "0..1"
}
}
def dispatch getServiceContent(LService service) '''
««« <?xml version="1.0" encoding="UTF-8"?>
««« <components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0">
««« <scr:component name="«service.fullyQualifiedName.toLowerCase»">
««« <implementation class="«service.fullyQualifiedName»"/>
««« <service>
««« <provide interface="org.eclipse.osbp.dsl.service.lib.IDTOService"/>
««« </service>
««« <property name="dto" value="«service.dto.fullyQualifiedName.toString»"/>
««« <property name="service.pid" value="«service.fullyQualifiedName.toLowerCase»"/>
««« «FOR ref : service.injectedServices.services»
««« <reference name="«ref.attributeName.toFirstLower»" interface="«ref.service.qualifiedName.toString»"
««« cardinality="«ref.cardinality.cardinalityString»" policy="dynamic" bind="bind«ref.attributeName.
««« toFirstUpper»" unbind="unbind«ref.attributeName.toFirstUpper»"/>
««« «ENDFOR»
««« </scr:component>
««« </components>
'''
}