use of org.wso2.ballerinalang.compiler.codegen.CodeGenerator.VariableIndex.Kind.LOCAL in project carbon-apimgt by wso2.
the class APIProviderImpl method addLocalScopes.
/**
* Add local scopes for the API if the scopes does not exist as shared scopes. The local scopes to add will be
* take from the URI templates.
*
* @param apiName API name
* @param uriTemplates URI Templates
* @param organization Organization
* @throws APIManagementException if fails to add local scopes for the API
*/
private void addLocalScopes(String apiName, Set<URITemplate> uriTemplates, String organization) throws APIManagementException {
int tenantId = APIUtil.getInternalOrganizationId(organization);
String tenantDomain = APIUtil.getTenantDomainFromTenantId(tenantId);
Map<String, KeyManagerDto> tenantKeyManagers = KeyManagerHolder.getTenantKeyManagers(tenantDomain);
// Get the local scopes set to register for the API from URI templates
Set<Scope> scopesToRegister = getScopesToRegisterFromURITemplates(apiName, organization, uriTemplates);
// Register scopes
for (Scope scope : scopesToRegister) {
for (Map.Entry<String, KeyManagerDto> keyManagerDtoEntry : tenantKeyManagers.entrySet()) {
KeyManager keyManager = keyManagerDtoEntry.getValue().getKeyManager();
if (keyManager != null) {
String scopeKey = scope.getKey();
try {
// version.
if (!keyManager.isScopeExists(scopeKey)) {
// register scope in KM
keyManager.registerScope(scope);
} else {
if (log.isDebugEnabled()) {
log.debug("Scope: " + scopeKey + " already registered in KM. Skipping registering scope.");
}
}
} catch (APIManagementException e) {
log.error("Error while registering Scope " + scopeKey + "in Key Manager " + keyManagerDtoEntry.getKey(), e);
}
}
}
}
addScopes(scopesToRegister, tenantId);
}
use of org.wso2.ballerinalang.compiler.codegen.CodeGenerator.VariableIndex.Kind.LOCAL in project carbon-apimgt by wso2.
the class APIProviderImpl method deleteAPIFromDB.
/**
* Deletes API from the database and delete local scopes and resource scope attachments from KM.
*
* @param api API to delete
* @throws APIManagementException if fails to delete the API
*/
private void deleteAPIFromDB(API api) throws APIManagementException {
APIIdentifier apiIdentifier = api.getId();
int tenantId = APIUtil.getTenantId(APIUtil.replaceEmailDomainBack(apiIdentifier.getProviderName()));
String tenantDomain = APIUtil.getTenantDomainFromTenantId(tenantId);
// Get local scopes for the given API which are not already assigned for different versions of the same API
Set<String> localScopeKeysToDelete = apiMgtDAO.getUnversionedLocalScopeKeysForAPI(api.getUuid(), tenantId);
// Get the URI Templates for the given API to detach the resources scopes from
Set<URITemplate> uriTemplates = apiMgtDAO.getURITemplatesOfAPI(api.getUuid());
// Detach all the resource scopes from the API resources in KM
Map<String, KeyManagerDto> tenantKeyManagers = KeyManagerHolder.getTenantKeyManagers(tenantDomain);
for (Map.Entry<String, KeyManagerDto> keyManagerDtoEntry : tenantKeyManagers.entrySet()) {
KeyManager keyManager = keyManagerDtoEntry.getValue().getKeyManager();
if (keyManager != null) {
try {
keyManager.detachResourceScopes(api, uriTemplates);
if (log.isDebugEnabled()) {
log.debug("Resource scopes are successfully detached for the API : " + apiIdentifier + " from Key Manager :" + keyManagerDtoEntry.getKey() + ".");
}
// remove the local scopes from the KM
for (String localScope : localScopeKeysToDelete) {
keyManager.deleteScope(localScope);
}
if (log.isDebugEnabled()) {
log.debug("Local scopes are successfully deleted for the API : " + apiIdentifier + " from Key Manager : " + keyManagerDtoEntry.getKey() + ".");
}
} catch (APIManagementException e) {
log.error("Error while Detach and Delete Scope from Key Manager " + keyManagerDtoEntry.getKey(), e);
}
}
}
deleteScopes(localScopeKeysToDelete, tenantId);
apiMgtDAO.deleteAPI(api.getUuid());
if (log.isDebugEnabled()) {
log.debug("API : " + apiIdentifier + " is successfully deleted from the database and Key Manager.");
}
}
use of org.wso2.ballerinalang.compiler.codegen.CodeGenerator.VariableIndex.Kind.LOCAL in project ballerina by ballerina-lang.
the class CodeGenerator method generateForeachVarAssignment.
// private helper methods of visitors.
private void generateForeachVarAssignment(BLangForeach foreach, Operand iteratorIndex) {
List<BLangVariableReference> variables = foreach.varRefs.stream().map(expr -> (BLangVariableReference) expr).collect(Collectors.toList());
// create Local variable Info entries.
variables.stream().filter(// Ignoring ignored ("_") variables.
v -> v.type.tag != TypeTags.NONE).forEach(varRef -> visitVarSymbol(varRef.symbol, lvIndexes, localVarAttrInfo));
List<Operand> nextOperands = new ArrayList<>();
nextOperands.add(iteratorIndex);
nextOperands.add(new Operand(variables.size()));
foreach.varTypes.forEach(v -> nextOperands.add(new Operand(v.tag)));
nextOperands.add(new Operand(variables.size()));
for (int i = 0; i < variables.size(); i++) {
BLangVariableReference varRef = variables.get(i);
nextOperands.add(Optional.ofNullable(varRef.symbol.varIndex).orElse(getRegIndex(foreach.varTypes.get(i).tag)));
}
this.emit(InstructionCodes.ITR_NEXT, nextOperands.toArray(new Operand[0]));
}
use of org.wso2.ballerinalang.compiler.codegen.CodeGenerator.VariableIndex.Kind.LOCAL in project ballerina by ballerina-lang.
the class CodeGenerator method endWorkerInfoUnit.
private void endWorkerInfoUnit(CodeAttributeInfo codeAttributeInfo) {
codeAttributeInfo.maxLongLocalVars = lvIndexes.tInt + 1;
codeAttributeInfo.maxDoubleLocalVars = lvIndexes.tFloat + 1;
codeAttributeInfo.maxStringLocalVars = lvIndexes.tString + 1;
codeAttributeInfo.maxIntLocalVars = lvIndexes.tBoolean + 1;
codeAttributeInfo.maxByteLocalVars = lvIndexes.tBlob + 1;
codeAttributeInfo.maxRefLocalVars = lvIndexes.tRef + 1;
codeAttributeInfo.maxLongRegs = codeAttributeInfo.maxLongLocalVars + maxRegIndexes.tInt + 1;
codeAttributeInfo.maxDoubleRegs = codeAttributeInfo.maxDoubleLocalVars + maxRegIndexes.tFloat + 1;
codeAttributeInfo.maxStringRegs = codeAttributeInfo.maxStringLocalVars + maxRegIndexes.tString + 1;
codeAttributeInfo.maxIntRegs = codeAttributeInfo.maxIntLocalVars + maxRegIndexes.tBoolean + 1;
codeAttributeInfo.maxByteRegs = codeAttributeInfo.maxByteLocalVars + maxRegIndexes.tBlob + 1;
codeAttributeInfo.maxRefRegs = codeAttributeInfo.maxRefLocalVars + maxRegIndexes.tRef + 1;
// Update register indexes.
for (RegIndex regIndex : regIndexList) {
switch(regIndex.typeTag) {
case TypeTags.INT:
regIndex.value = regIndex.value + codeAttributeInfo.maxLongLocalVars;
break;
case TypeTags.FLOAT:
regIndex.value = regIndex.value + codeAttributeInfo.maxDoubleLocalVars;
break;
case TypeTags.STRING:
regIndex.value = regIndex.value + codeAttributeInfo.maxStringLocalVars;
break;
case TypeTags.BOOLEAN:
regIndex.value = regIndex.value + codeAttributeInfo.maxIntLocalVars;
break;
case TypeTags.BLOB:
regIndex.value = regIndex.value + codeAttributeInfo.maxByteLocalVars;
break;
default:
regIndex.value = regIndex.value + codeAttributeInfo.maxRefLocalVars;
break;
}
}
regIndexList = new ArrayList<>();
lvIndexes = new VariableIndex(LOCAL);
regIndexes = new VariableIndex(REG);
maxRegIndexes = new VariableIndex(REG);
}
use of org.wso2.ballerinalang.compiler.codegen.CodeGenerator.VariableIndex.Kind.LOCAL in project ballerina by ballerina-lang.
the class CodeGenerator method visitInvokableNode.
private void visitInvokableNode(BLangInvokableNode invokableNode, CallableUnitInfo callableUnitInfo, SymbolEnv invokableSymbolEnv) {
int localVarAttrNameIndex = addUTF8CPEntry(currentPkgInfo, AttributeInfo.Kind.LOCAL_VARIABLES_ATTRIBUTE.value());
LocalVariableAttributeInfo localVarAttributeInfo = new LocalVariableAttributeInfo(localVarAttrNameIndex);
// TODO Read annotations attached to this callableUnit
// Add local variable indexes to the parameters and return parameters
visitInvokableNodeParams(invokableNode.symbol, callableUnitInfo, localVarAttributeInfo);
if (Symbols.isNative(invokableNode.symbol)) {
this.processWorker(invokableNode, callableUnitInfo.defaultWorkerInfo, null, localVarAttributeInfo, invokableSymbolEnv, true, null);
} else {
// Clone lvIndex structure here. This structure contain local variable indexes of the input and
// out parameters and they are common for all the workers.
VariableIndex lvIndexCopy = this.copyVarIndex(lvIndexes);
this.processWorker(invokableNode, callableUnitInfo.defaultWorkerInfo, invokableNode.body, localVarAttributeInfo, invokableSymbolEnv, true, lvIndexCopy);
for (BLangWorker worker : invokableNode.getWorkers()) {
this.processWorker(invokableNode, callableUnitInfo.getWorkerInfo(worker.name.value), worker.body, localVarAttributeInfo, invokableSymbolEnv, false, this.copyVarIndex(lvIndexCopy));
}
}
}
Aggregations