Skip to content

Commit

Permalink
feat: add InstanceScopedThreadSafeAccess
Browse files Browse the repository at this point in the history
  • Loading branch information
MateusMolina committed Dec 4, 2024
1 parent 0ee0c35 commit 0d39682
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 60 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
import org.eclipse.digitaltwin.aas4j.v3.model.SpecificAssetId;
import org.eclipse.digitaltwin.basyx.aasdiscoveryservice.core.AasDiscoveryService;
import org.eclipse.digitaltwin.basyx.aasdiscoveryservice.core.model.AssetLink;
import org.eclipse.digitaltwin.basyx.common.backend.ThreadSafeAccess;
import org.eclipse.digitaltwin.basyx.common.backend.InstanceScopedThreadSafeAccess;
import org.eclipse.digitaltwin.basyx.core.pagination.CursorResult;
import org.eclipse.digitaltwin.basyx.core.pagination.PaginationInfo;

Expand All @@ -42,30 +42,30 @@
public class ThreadSafeAasDiscovery implements AasDiscoveryService {

private final AasDiscoveryService decoratedAasDiscovery;
private final ThreadSafeAccess access = new ThreadSafeAccess();
private final InstanceScopedThreadSafeAccess access = new InstanceScopedThreadSafeAccess();

public ThreadSafeAasDiscovery(AasDiscoveryService decoratedAasDiscovery) {
this.decoratedAasDiscovery = decoratedAasDiscovery;
}

@Override
public CursorResult<List<String>> getAllAssetAdministrationShellIdsByAssetLink(PaginationInfo pInfo, List<AssetLink> assetIds) {
return access.read(() -> decoratedAasDiscovery.getAllAssetAdministrationShellIdsByAssetLink(pInfo, assetIds));
return decoratedAasDiscovery.getAllAssetAdministrationShellIdsByAssetLink(pInfo, assetIds);
}

@Override
public List<SpecificAssetId> getAllAssetLinksById(String shellIdentifier) {
return access.read(() -> decoratedAasDiscovery.getAllAssetLinksById(shellIdentifier));
return access.read(() -> decoratedAasDiscovery.getAllAssetLinksById(shellIdentifier), shellIdentifier);
}

@Override
public List<SpecificAssetId> createAllAssetLinksById(String shellIdentifier, List<SpecificAssetId> assetIds) {
return access.write(() -> decoratedAasDiscovery.createAllAssetLinksById(shellIdentifier, assetIds));
return access.write(() -> decoratedAasDiscovery.createAllAssetLinksById(shellIdentifier, assetIds), shellIdentifier);
}

@Override
public void deleteAllAssetLinksById(String shellIdentifier) {
access.write(() -> decoratedAasDiscovery.deleteAllAssetLinksById(shellIdentifier));
access.write(() -> decoratedAasDiscovery.deleteAllAssetLinksById(shellIdentifier), shellIdentifier);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
import org.eclipse.digitaltwin.aas4j.v3.model.AssetInformation;
import org.eclipse.digitaltwin.aas4j.v3.model.Reference;
import org.eclipse.digitaltwin.basyx.aasrepository.AasRepository;
import org.eclipse.digitaltwin.basyx.common.backend.ThreadSafeAccess;
import org.eclipse.digitaltwin.basyx.common.backend.InstanceScopedThreadSafeAccess;
import org.eclipse.digitaltwin.basyx.core.exceptions.CollidingIdentifierException;
import org.eclipse.digitaltwin.basyx.core.exceptions.ElementDoesNotExistException;
import org.eclipse.digitaltwin.basyx.core.exceptions.MissingIdentifierException;
Expand All @@ -48,75 +48,75 @@
public class ThreadSafeAasRepository implements AasRepository {

private final AasRepository decoratedAasRepository;
private final ThreadSafeAccess access = new ThreadSafeAccess();
private final InstanceScopedThreadSafeAccess access = new InstanceScopedThreadSafeAccess();

public ThreadSafeAasRepository(AasRepository decoratedRepository) {
this.decoratedAasRepository = decoratedRepository;
}

@Override
public CursorResult<List<AssetAdministrationShell>> getAllAas(PaginationInfo pInfo) {
return access.read(() -> decoratedAasRepository.getAllAas(pInfo));
return decoratedAasRepository.getAllAas(pInfo);
}

@Override
public AssetAdministrationShell getAas(String aasId) throws ElementDoesNotExistException {
return access.read(() -> decoratedAasRepository.getAas(aasId));
return access.read(() -> decoratedAasRepository.getAas(aasId), aasId);
}

@Override
public void createAas(AssetAdministrationShell aas) throws CollidingIdentifierException, MissingIdentifierException {
access.write(() -> decoratedAasRepository.createAas(aas));
decoratedAasRepository.createAas(aas);
}

@Override
public void deleteAas(String aasId) {
access.write(() -> decoratedAasRepository.deleteAas(aasId));
access.write(() -> decoratedAasRepository.deleteAas(aasId), aasId);
}

@Override
public void updateAas(String aasId, AssetAdministrationShell aas) {
access.write(() -> decoratedAasRepository.updateAas(aasId, aas));
access.write(() -> decoratedAasRepository.updateAas(aasId, aas), aasId);
}

@Override
public CursorResult<List<Reference>> getSubmodelReferences(String aasId, PaginationInfo pInfo) {
return access.read(() -> decoratedAasRepository.getSubmodelReferences(aasId, pInfo));
return access.read(() -> decoratedAasRepository.getSubmodelReferences(aasId, pInfo), aasId);
}

@Override
public void addSubmodelReference(String aasId, Reference submodelReference) {
access.write(() -> decoratedAasRepository.addSubmodelReference(aasId, submodelReference));
access.write(() -> decoratedAasRepository.addSubmodelReference(aasId, submodelReference), aasId);
}

@Override
public void removeSubmodelReference(String aasId, String submodelId) {
access.write(() -> decoratedAasRepository.removeSubmodelReference(aasId, submodelId));
access.write(() -> decoratedAasRepository.removeSubmodelReference(aasId, submodelId), aasId);
}

@Override
public void setAssetInformation(String aasId, AssetInformation aasInfo) throws ElementDoesNotExistException {
access.write(() -> decoratedAasRepository.setAssetInformation(aasId, aasInfo));
access.write(() -> decoratedAasRepository.setAssetInformation(aasId, aasInfo), aasId);
}

@Override
public AssetInformation getAssetInformation(String aasId) throws ElementDoesNotExistException {
return access.read(() -> decoratedAasRepository.getAssetInformation(aasId));
return access.read(() -> decoratedAasRepository.getAssetInformation(aasId), aasId);
}

@Override
public File getThumbnail(String aasId) {
return access.read(() -> decoratedAasRepository.getThumbnail(aasId));
return access.read(() -> decoratedAasRepository.getThumbnail(aasId), aasId);
}

@Override
public void setThumbnail(String aasId, String fileName, String contentType, InputStream inputStream) {
access.write(() -> decoratedAasRepository.setThumbnail(aasId, fileName, contentType, inputStream));
access.write(() -> decoratedAasRepository.setThumbnail(aasId, fileName, contentType, inputStream), aasId);
}

@Override
public void deleteThumbnail(String aasId) {
access.write(() -> decoratedAasRepository.deleteThumbnail(aasId));
access.write(() -> decoratedAasRepository.deleteThumbnail(aasId), aasId);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@

import org.eclipse.digitaltwin.aas4j.v3.model.PackageDescription;
import org.eclipse.digitaltwin.basyx.aasxfileserver.AASXFileServer;
import org.eclipse.digitaltwin.basyx.common.backend.ThreadSafeAccess;
import org.eclipse.digitaltwin.basyx.common.backend.InstanceScopedThreadSafeAccess;
import org.eclipse.digitaltwin.basyx.core.exceptions.ElementDoesNotExistException;
import org.eclipse.digitaltwin.basyx.core.pagination.CursorResult;
import org.eclipse.digitaltwin.basyx.core.pagination.PaginationInfo;
Expand All @@ -44,35 +44,35 @@
public class ThreadSafeAASXFileServer implements AASXFileServer {

private final AASXFileServer decoratedAasxFileServer;
private final ThreadSafeAccess access = new ThreadSafeAccess();
private final InstanceScopedThreadSafeAccess access = new InstanceScopedThreadSafeAccess();

public ThreadSafeAASXFileServer(AASXFileServer aasxFileServer) {
this.decoratedAasxFileServer = aasxFileServer;
}

@Override
public CursorResult<List<PackageDescription>> getAllAASXPackageIds(String shellId, PaginationInfo pInfo) {
return access.read(() -> decoratedAasxFileServer.getAllAASXPackageIds(shellId, pInfo));
return decoratedAasxFileServer.getAllAASXPackageIds(shellId, pInfo);
}

@Override
public InputStream getAASXByPackageId(String packageId) throws ElementDoesNotExistException {
return access.read(() -> decoratedAasxFileServer.getAASXByPackageId(packageId));
return access.read(() -> decoratedAasxFileServer.getAASXByPackageId(packageId), packageId);
}

@Override
public void updateAASXByPackageId(String packageId, List<String> shellIds, InputStream file, String filename) throws ElementDoesNotExistException {
access.write(() -> decoratedAasxFileServer.updateAASXByPackageId(packageId, shellIds, file, filename));
access.write(() -> decoratedAasxFileServer.updateAASXByPackageId(packageId, shellIds, file, filename), packageId);
}

@Override
public PackageDescription createAASXPackage(List<String> shellIds, InputStream file, String filename) {
return access.write(() -> decoratedAasxFileServer.createAASXPackage(shellIds, file, filename));
return decoratedAasxFileServer.createAASXPackage(shellIds, file, filename);
}

@Override
public void deleteAASXByPackageId(String packageId) throws ElementDoesNotExistException {
access.write(() -> decoratedAasxFileServer.deleteAASXByPackageId(packageId));
access.write(() -> decoratedAasxFileServer.deleteAASXByPackageId(packageId), packageId);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.eclipse.digitaltwin.basyx.common.backend;

import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;

public class InstanceScopedThreadSafeAccess {
private final ConcurrentHashMap<Object, ThreadSafeAccess> accessMap = new ConcurrentHashMap<>();

public <T> T read(Supplier<T> supplier, Object instanceLock) {
return getAccess(instanceLock).read(supplier);
}

public void read(Runnable action, Object instanceLock) {
getAccess(instanceLock).read(action);
}

public <T> T write(Supplier<T> supplier, Object instanceLock) {
return getAccess(instanceLock).write(supplier);
}

public void write(Runnable action, Object instanceLock) {
getAccess(instanceLock).write(action);
}

public void removeLock(Object instanceLock) {
accessMap.remove(instanceLock);
}

private ThreadSafeAccess getAccess(Object instanceLock) {
return accessMap.computeIfAbsent(instanceLock, k -> new ThreadSafeAccess());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

import org.eclipse.digitaltwin.aas4j.v3.model.ConceptDescription;
import org.eclipse.digitaltwin.aas4j.v3.model.Reference;
import org.eclipse.digitaltwin.basyx.common.backend.InstanceScopedThreadSafeAccess;
import org.eclipse.digitaltwin.basyx.common.backend.ThreadSafeAccess;
import org.eclipse.digitaltwin.basyx.conceptdescriptionrepository.ConceptDescriptionRepository;
import org.eclipse.digitaltwin.basyx.core.exceptions.CollidingIdentifierException;
Expand All @@ -44,7 +45,7 @@
*/
public class ThreadSafeConceptDescriptionRepository implements ConceptDescriptionRepository {

private final ThreadSafeAccess access = new ThreadSafeAccess();
private final InstanceScopedThreadSafeAccess access = new InstanceScopedThreadSafeAccess();
private final ConceptDescriptionRepository decoratedRepository;

public ThreadSafeConceptDescriptionRepository(ConceptDescriptionRepository decoratedRepository) {
Expand All @@ -53,42 +54,42 @@ public ThreadSafeConceptDescriptionRepository(ConceptDescriptionRepository decor

@Override
public CursorResult<List<ConceptDescription>> getAllConceptDescriptions(PaginationInfo pInfo) {
return access.read(() -> decoratedRepository.getAllConceptDescriptions(pInfo));
return decoratedRepository.getAllConceptDescriptions(pInfo);
}

@Override
public CursorResult<List<ConceptDescription>> getAllConceptDescriptionsByIdShort(String idShort, PaginationInfo pInfo) {
return access.read(() -> decoratedRepository.getAllConceptDescriptionsByIdShort(idShort, pInfo));
return decoratedRepository.getAllConceptDescriptionsByIdShort(idShort, pInfo);
}

@Override
public CursorResult<List<ConceptDescription>> getAllConceptDescriptionsByIsCaseOf(Reference isCaseOf, PaginationInfo pInfo) {
return access.read(() -> decoratedRepository.getAllConceptDescriptionsByIsCaseOf(isCaseOf, pInfo));
return decoratedRepository.getAllConceptDescriptionsByIsCaseOf(isCaseOf, pInfo);
}

@Override
public CursorResult<List<ConceptDescription>> getAllConceptDescriptionsByDataSpecificationReference(Reference dataSpecificationReference, PaginationInfo pInfo) {
return access.read(() -> decoratedRepository.getAllConceptDescriptionsByDataSpecificationReference(dataSpecificationReference, pInfo));
return decoratedRepository.getAllConceptDescriptionsByDataSpecificationReference(dataSpecificationReference, pInfo);
}

@Override
public ConceptDescription getConceptDescription(String conceptDescriptionId) throws ElementDoesNotExistException {
return access.read(() -> decoratedRepository.getConceptDescription(conceptDescriptionId));
return access.read(() -> decoratedRepository.getConceptDescription(conceptDescriptionId), conceptDescriptionId);
}

@Override
public void updateConceptDescription(String conceptDescriptionId, ConceptDescription conceptDescription) throws ElementDoesNotExistException {
access.write(() -> decoratedRepository.updateConceptDescription(conceptDescriptionId, conceptDescription));
access.write(() -> decoratedRepository.updateConceptDescription(conceptDescriptionId, conceptDescription), conceptDescriptionId);
}

@Override
public void createConceptDescription(ConceptDescription conceptDescription) throws CollidingIdentifierException, MissingIdentifierException {
access.write(() -> decoratedRepository.createConceptDescription(conceptDescription));
decoratedRepository.createConceptDescription(conceptDescription);
}

@Override
public void deleteConceptDescription(String conceptDescriptionId) throws ElementDoesNotExistException {
access.write(() -> decoratedRepository.deleteConceptDescription(conceptDescriptionId));
access.write(() -> decoratedRepository.deleteConceptDescription(conceptDescriptionId), conceptDescriptionId);
}

@Override
Expand Down
Loading

0 comments on commit 0d39682

Please sign in to comment.