本文整理汇总了Java中org.wso2.carbon.registry.api.Registry类的典型用法代码示例。如果您正苦于以下问题:Java Registry类的具体用法?Java Registry怎么用?Java Registry使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
Registry类属于org.wso2.carbon.registry.api包,在下文中一共展示了Registry类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Java代码示例。
示例1: persistVerificationCode
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
/**
* Helper method
*
* @param verificationCode verificationCode as String
* @param subscriberIds Array of subscriberIds
*/
private void persistVerificationCode(String verificationCode, String[] subscriberIds) {
Registry registry = EntitlementServiceComponent.
getGovernanceRegistry(CarbonContext.getThreadLocalCarbonContext().getTenantId());
try {
org.wso2.carbon.registry.api.Resource resource = registry.newResource();
resource.setProperty("subscriberIds", Arrays.asList(subscriberIds));
resource.setProperty("policyIds", Arrays.asList(policyIds));
resource.setProperty("action", action);
resource.setProperty("version", version);
resource.setProperty("order", Integer.toString(order));
registry.put(PDPConstants.ENTITLEMENT_POLICY_PUBLISHER_VERIFICATION + verificationCode,
resource);
} catch (org.wso2.carbon.registry.api.RegistryException e) {
log.error("Error while persisting verification code", e);
}
}
开发者ID:wso2,项目名称:carbon-identity-framework,代码行数:25,代码来源:PolicyPublishExecutor.java
示例2: renameAppPermissionPathNode
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
/**
* Rename the registry path node name for a deleted Service provider role.
*
* @param oldName
* @param newName
* @throws IdentityApplicationManagementException
*/
public static void renameAppPermissionPathNode(String oldName, String newName)
throws IdentityApplicationManagementException {
List<ApplicationPermission> loadPermissions = loadPermissions(oldName);
String newApplicationNode = ApplicationMgtUtil.getApplicationPermissionPath() + PATH_CONSTANT + oldName;
Registry tenantGovReg = CarbonContext.getThreadLocalCarbonContext().getRegistry(
RegistryType.USER_GOVERNANCE);
//creating new application node
try {
for (ApplicationPermission applicationPermission : loadPermissions) {
tenantGovReg.delete(newApplicationNode + PATH_CONSTANT + applicationPermission.getValue());
}
tenantGovReg.delete(newApplicationNode);
Collection permissionNode = tenantGovReg.newCollection();
permissionNode.setProperty("name", newName);
newApplicationNode = ApplicationMgtUtil.getApplicationPermissionPath() + PATH_CONSTANT + newName;
ApplicationMgtUtil.applicationNode = newApplicationNode;
tenantGovReg.put(newApplicationNode, permissionNode);
addPermission(loadPermissions.toArray(new ApplicationPermission[loadPermissions.size()]), tenantGovReg);
} catch (RegistryException e) {
throw new IdentityApplicationManagementException("Error while renaming permission node "
+ oldName + "to " + newName, e);
}
}
开发者ID:wso2,项目名称:carbon-identity-framework,代码行数:32,代码来源:ApplicationMgtUtil.java
示例3: addPermission
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
private static void addPermission(ApplicationPermission[] permissions, Registry tenantGovReg) throws
RegistryException {
for (ApplicationPermission permission : permissions) {
String permissionValue = permission.getValue();
if ("/".equals(permissionValue.substring(0, 1))) { //if permissions are starts with slash remove that
permissionValue = permissionValue.substring(1);
}
String[] splitedPermission = permissionValue.split("/");
String permissinPath = applicationNode + PATH_CONSTANT;
for (int i = 0; i < splitedPermission.length; i++) {
permissinPath = permissinPath + splitedPermission[i] + PATH_CONSTANT;
Collection permissionNode = tenantGovReg.newCollection();
permissionNode.setProperty("name", splitedPermission[i]);
tenantGovReg.put(permissinPath, permissionNode);
}
}
}
开发者ID:wso2,项目名称:carbon-identity-framework,代码行数:21,代码来源:ApplicationMgtUtil.java
示例4: deletePermissions
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
/**
* Delete the resource
*
* @param applicationName
* @throws IdentityApplicationManagementException
*/
public static void deletePermissions(String applicationName) throws IdentityApplicationManagementException {
String applicationNode = getApplicationPermissionPath() + PATH_CONSTANT + applicationName;
Registry tenantGovReg = CarbonContext.getThreadLocalCarbonContext().getRegistry(
RegistryType.USER_GOVERNANCE);
try {
boolean exist = tenantGovReg.resourceExists(applicationNode);
if (exist) {
tenantGovReg.delete(applicationNode);
}
} catch (RegistryException e) {
throw new IdentityApplicationManagementException("Error while storing permissions", e);
}
}
开发者ID:wso2,项目名称:carbon-identity-framework,代码行数:24,代码来源:ApplicationMgtUtil.java
示例5: buildUIPermissionNode
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
private void buildUIPermissionNode(Collection parent, UIPermissionNode parentNode,
Registry registry, Registry tenantRegistry, AuthorizationManager authMan,
String roleName, String userName)
throws RegistryException, UserStoreException {
boolean isSelected = false;
if (roleName != null) {
isSelected = authMan.isRoleAuthorized(roleName, parentNode.getResourcePath(),
UserMgtConstants.EXECUTE_ACTION);
} else if (userName != null) {
isSelected = authMan.isUserAuthorized(userName, parentNode.getResourcePath(),
UserMgtConstants.EXECUTE_ACTION);
}
if (isSelected) {
buildUIPermissionNodeAllSelected(parent, parentNode, registry, tenantRegistry);
parentNode.setSelected(true);
} else {
buildUIPermissionNodeNotAllSelected(parent, parentNode, registry, tenantRegistry,
authMan, roleName, userName);
}
}
开发者ID:wso2,项目名称:carbon-identity-framework,代码行数:22,代码来源:UserRealmProxy.java
示例6: buildUIPermissionNodeAllSelected
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
private void buildUIPermissionNodeAllSelected(Collection parent, UIPermissionNode parentNode,
Registry registry, Registry tenantRegistry) throws RegistryException,
UserStoreException {
String[] children = parent.getChildren();
UIPermissionNode[] childNodes = new UIPermissionNode[children.length];
for (int i = 0; i < children.length; i++) {
String child = children[i];
Resource resource = null;
if (registry.resourceExists(child)) {
resource = registry.get(child);
} else if (tenantRegistry != null) {
resource = tenantRegistry.get(child);
} else {
throw new RegistryException("Permission resource not found in the registry.");
}
childNodes[i] = getUIPermissionNode(resource, true);
if (resource instanceof Collection) {
buildUIPermissionNodeAllSelected((Collection) resource, childNodes[i], registry,
tenantRegistry);
}
}
parentNode.setNodeList(childNodes);
}
开发者ID:wso2,项目名称:carbon-identity-framework,代码行数:27,代码来源:UserRealmProxy.java
示例7: getSpeedAlerts
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
@Override
public String getSpeedAlerts(DeviceIdentifier identifier) throws GeoLocationBasedServiceException {
try {
Registry registry = getGovernanceRegistry();
Resource resource = registry.get(GeoServices.REGISTRY_PATH_FOR_ALERTS +
GeoServices.ALERT_TYPE_SPEED + "/" + identifier.getId());
if (resource == null) {
return "{'content': false}";
}
InputStream inputStream = resource.getContentStream();
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, "UTF-8");
return "{'speedLimit':" + writer.toString() + "}";
} catch (RegistryException | IOException e) {
return "{'content': false}";
}
}
开发者ID:wso2,项目名称:carbon-device-mgt,代码行数:18,代码来源:GeoLocationProviderServiceImpl.java
示例8: getProximityAlerts
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
@Override
public String getProximityAlerts(DeviceIdentifier identifier) throws GeoLocationBasedServiceException {
try {
Registry registry = getGovernanceRegistry();
Resource resource = registry.get(GeoServices.REGISTRY_PATH_FOR_ALERTS +
GeoServices.ALERT_TYPE_PROXIMITY
+ "/" + identifier.getId());
if (resource != null) {
Properties props = resource.getProperties();
List proxDisObj = (List) props.get(GeoServices.PROXIMITY_DISTANCE);
List proxTimeObj = (List) props.get(GeoServices.PROXIMITY_TIME);
return String.format("{proximityDistance:\"%s\", proximityTime:\"%s\"}",
proxDisObj != null ? proxDisObj.get(0).toString() : "",
proxTimeObj != null ? proxTimeObj.get(0).toString() : "");
} else {
return "{'content': false}";
}
} catch (RegistryException e) {
return "{'content': false}";
}
}
开发者ID:wso2,项目名称:carbon-device-mgt,代码行数:24,代码来源:GeoLocationProviderServiceImpl.java
示例9: updateRegistry
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
private void updateRegistry(String path, DeviceIdentifier identifier, Object content, Map<String, String> options)
throws GeoLocationBasedServiceException {
try {
Registry registry = getGovernanceRegistry();
Resource newResource = registry.newResource();
newResource.setContent(content);
newResource.setMediaType("application/json");
for (Map.Entry<String, String> option : options.entrySet()) {
newResource.addProperty(option.getKey(), option.getValue());
}
registry.put(path, newResource);
} catch (RegistryException e) {
throw new GeoLocationBasedServiceException(
"Error occurred while setting the Within Alert for " + identifier.getType() + " with id: " +
identifier.getId(), e);
}
}
开发者ID:wso2,项目名称:carbon-device-mgt,代码行数:19,代码来源:GeoLocationProviderServiceImpl.java
示例10: getResourceStream
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
@Override
public InputStream getResourceStream(String name) throws ResourceNotFoundException {
try {
Registry registry =
CarbonContext.getThreadLocalCarbonContext().getRegistry(RegistryType.SYSTEM_CONFIGURATION);
if (registry == null) {
throw new IllegalStateException("No valid registry instance is attached to the current carbon context");
}
if (!registry.resourceExists(EMAIL_CONFIG_BASE_LOCATION + "/" + name)) {
throw new ResourceNotFoundException("Resource '" + name + "' does not exist");
}
org.wso2.carbon.registry.api.Resource resource =
registry.get(EMAIL_CONFIG_BASE_LOCATION + "/" + name);
resource.setMediaType("text/plain");
return resource.getContentStream();
} catch (RegistryException e) {
throw new ResourceNotFoundException("Error occurred while retrieving resource", e);
}
}
开发者ID:wso2,项目名称:carbon-device-mgt,代码行数:20,代码来源:RegistryBasedResourceLoader.java
示例11: write
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
@Override
public void write(String outPath, InputStream in) throws MLOutputAdapterException {
if (in == null || outPath == null) {
throw new MLOutputAdapterException(String.format(
"Null argument values detected. Input stream: %s Out Path: %s", in, outPath));
}
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
IOUtils.copy(in, byteArrayOutputStream);
byte[] array = byteArrayOutputStream.toByteArray();
PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
Registry registry = carbonContext.getRegistry(RegistryType.SYSTEM_GOVERNANCE);
Resource resource = registry.newResource();
resource.setContent(array);
registry.put(outPath, resource);
} catch (RegistryException | IOException e) {
throw new MLOutputAdapterException(
String.format("Failed to save the model to registry %s: %s", outPath, e), e);
}
}
开发者ID:wso2-attic,项目名称:carbon-ml,代码行数:24,代码来源:RegistryOutputAdapter.java
示例12: getKPIConfiguration
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
/**
* Get DAS config details of given certain process which are configured for analytics from the config registry
*
* @param processDefinitionId Process definition ID
* @return KPI configuration details in JSON format. Ex:<p>
* {"processDefinitionId":"myProcess3:1:32518","eventStreamName":"t_666_process_stream","eventStreamVersion":"1.0.0"
* ,"eventStreamDescription":"This is the event stream generated to configure process analytics with DAS, for the
* processt_666","eventStreamNickName":"t_666_process_stream","eventStreamId":"t_666_process_stream:1.0.0",
* "eventReceiverName":"t_666_process_receiver","pcProcessId":"t:666",
* "processVariables":[{"name":"processInstanceId","type":"string","isAnalyzeData":"false",
* "isDrillDownData":"false"}
* ,{"name":"valuesAvailability","type":"string","isAnalyzeData":"false","isDrillDownData":"false"}
* ,{"name":"custid","type":"string","isAnalyzeData":false,"isDrillDownData":false}
* ,{"name":"amount","type":"long","isAnalyzeData":false,"isDrillDownData":false}
* ,{"name":"confirm","type":"bool","isAnalyzeData":false,"isDrillDownData":false}]}
* @throws RegistryException
*/
public JsonNode getKPIConfiguration(String processDefinitionId) throws RegistryException, IOException {
String resourcePath = AnalyticsPublisherConstants.REG_PATH_BPMN_ANALYTICS + processDefinitionId + "/"
+ AnalyticsPublisherConstants.ANALYTICS_CONFIG_FILE_NAME;
try {
RegistryService registryService = BPMNAnalyticsHolder.getInstance().getRegistryService();
Registry configRegistry = registryService.getConfigSystemRegistry();
if (configRegistry.resourceExists(resourcePath)) {
Resource processRegistryResource = configRegistry.get(resourcePath);
String dasConfigDetailsJSONStr = new String((byte[]) processRegistryResource.getContent(),
StandardCharsets.UTF_8);
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readTree(dasConfigDetailsJSONStr);
}
return null;
} catch (RegistryException e) {
String errMsg = "Error in Getting DAS config details of given process definition id :" + processDefinitionId
+ " from the BPS Config registry-" + resourcePath;
throw new RegistryException(errMsg, e);
}
}
开发者ID:wso2,项目名称:carbon-business-process,代码行数:40,代码来源:BPMNDataPublisher.java
示例13: getLatestChecksum
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
/**
* Get the checksum of latest deployment for given deployment name
*
* @param deploymentName
* @return
* @throws BPSFault
*/
public String getLatestChecksum(String deploymentName) throws BPSFault {
try {
Integer tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
RegistryService registryService = BPMNServerHolder.getInstance().getRegistryService();
Registry tenantRegistry = registryService.getConfigSystemRegistry(tenantId);
String deploymentRegistryPath = BPMNConstants.BPMN_REGISTRY_PATH + BPMNConstants.REGISTRY_PATH_SEPARATOR
+ deploymentName;
if (tenantRegistry.resourceExists(deploymentRegistryPath)) {
Resource deploymentEntry = tenantRegistry.get(deploymentRegistryPath);
return deploymentEntry.getProperty(BPMNConstants.LATEST_CHECKSUM_PROPERTY);
} else {
return null;
}
} catch (RegistryException e) {
String msg = "Error while accessing registry to get latest checksum for package : " + deploymentName;
throw new BPSFault(msg, e);
}
}
开发者ID:wso2,项目名称:carbon-business-process,代码行数:27,代码来源:BPMNDeploymentService.java
示例14: getPolicy
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
@Override
public PolicyDTO getPolicy(String policyId, String version) throws EntitlementException {
// Zero means current version
if (version == null || version.trim().length() == 0) {
Registry registry = EntitlementServiceComponent.
getGovernanceRegistry(CarbonContext.getThreadLocalCarbonContext().getTenantId());
try {
Collection collection = (Collection) registry.
get(PDPConstants.ENTITLEMENT_POLICY_VERSION + policyId);
if (collection != null) {
version = collection.getProperty("version");
}
} catch (RegistryException e) {
log.error(e);
throw new EntitlementException("Invalid policy version");
}
}
PAPPolicyStore policyStore = new PAPPolicyStore();
PAPPolicyStoreReader reader = new PAPPolicyStoreReader(policyStore);
Resource resource = policyStore.getPolicy(version,
PDPConstants.ENTITLEMENT_POLICY_VERSION + policyId +
RegistryConstants.PATH_SEPARATOR);
if (resource == null) {
throw new EntitlementException("Invalid policy version");
}
return reader.readPolicyDTO(resource);
}
开发者ID:wso2,项目名称:carbon-identity-framework,代码行数:32,代码来源:DefaultPolicyVersionManager.java
示例15: deletePolicy
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
@Override
public void deletePolicy(String policyId) throws EntitlementException {
Registry registry = EntitlementServiceComponent.
getGovernanceRegistry(CarbonContext.getThreadLocalCarbonContext().getTenantId());
try {
if (registry.resourceExists(PDPConstants.ENTITLEMENT_POLICY_VERSION + policyId)) {
registry.delete(PDPConstants.ENTITLEMENT_POLICY_VERSION + policyId);
}
} catch (RegistryException e) {
log.error("Error while deleting all versions of policy", e);
}
}
开发者ID:wso2,项目名称:carbon-identity-framework,代码行数:14,代码来源:DefaultPolicyVersionManager.java
示例16: loadVerificationCode
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
/**
* Helper method
*
* @param verificationCode verificationCode as String
*/
private void loadVerificationCode(String verificationCode) {
Registry registry = EntitlementServiceComponent.
getGovernanceRegistry(CarbonContext.getThreadLocalCarbonContext().getTenantId());
try {
org.wso2.carbon.registry.api.Resource resource = registry.
get(PDPConstants.ENTITLEMENT_POLICY_PUBLISHER_VERIFICATION + verificationCode);
List<String> list = resource.getPropertyValues("subscriberIds");
if (list != null) {
subscriberIds = list.toArray(new String[list.size()]);
}
list = resource.getPropertyValues("policyIds");
if (list != null) {
policyIds = list.toArray(new String[list.size()]);
}
String version = resource.getProperty("version");
if (version != null) {
this.version = version;
}
String action = resource.getProperty("action");
if (action != null) {
this.action = action;
}
String order = resource.getProperty("order");
if (order != null) {
this.order = Integer.parseInt(order);
}
} catch (org.wso2.carbon.registry.api.RegistryException e) {
log.error("Error while loading verification code", e);
}
}
开发者ID:wso2,项目名称:carbon-identity-framework,代码行数:37,代码来源:PolicyPublishExecutor.java
示例17: persistConfig
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
@Override
public void persistConfig(String policyEditorType, String xmlConfig) throws PolicyEditorException {
super.persistConfig(policyEditorType, xmlConfig);
Registry registry = CarbonContext.getThreadLocalCarbonContext().getRegistry(RegistryType.SYSTEM_GOVERNANCE);
try {
Resource resource = registry.newResource();
resource.setContent(xmlConfig);
String path = null;
if (EntitlementConstants.PolicyEditor.BASIC.equals(policyEditorType)) {
path = EntitlementConstants.ENTITLEMENT_POLICY_BASIC_EDITOR_CONFIG_FILE_REGISTRY_PATH;
} else if (EntitlementConstants.PolicyEditor.STANDARD.equals(policyEditorType)) {
path = EntitlementConstants.ENTITLEMENT_POLICY_STANDARD_EDITOR_CONFIG_FILE_REGISTRY_PATH;
} else if (EntitlementConstants.PolicyEditor.RBAC.equals(policyEditorType)) {
path = EntitlementConstants.ENTITLEMENT_POLICY_RBAC_EDITOR_CONFIG_FILE_REGISTRY_PATH;
} else if (EntitlementConstants.PolicyEditor.SET.equals(policyEditorType)) {
path = EntitlementConstants.ENTITLEMENT_POLICY_SET_EDITOR_CONFIG_FILE_REGISTRY_PATH;
} else {
//default
path = EntitlementConstants.ENTITLEMENT_POLICY_BASIC_EDITOR_CONFIG_FILE_REGISTRY_PATH;
}
registry.put(path, resource);
} catch (RegistryException e) {
throw new PolicyEditorException("Error while persisting policy editor config");
}
}
开发者ID:wso2,项目名称:carbon-identity-framework,代码行数:28,代码来源:RegistryPersistenceManager.java
示例18: buildUIPermissionNodeNotAllSelected
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
private void buildUIPermissionNodeNotAllSelected(Collection parent, UIPermissionNode parentNode,
Registry registry, Registry tenantRegistry,
AuthorizationManager authMan, String roleName, String userName)
throws RegistryException, UserStoreException {
String[] children = parent.getChildren();
UIPermissionNode[] childNodes = new UIPermissionNode[children.length];
for (int i = 0; i < children.length; i++) {
String child = children[i];
Resource resource = null;
if (tenantRegistry != null && child.startsWith("/permission/applications")) {
resource = tenantRegistry.get(child);
} else if (registry.resourceExists(child)) {
resource = registry.get(child);
} else {
throw new RegistryException("Permission resource not found in the registry.");
}
boolean isSelected = false;
if (roleName != null) {
isSelected = authMan.isRoleAuthorized(roleName, child,
UserMgtConstants.EXECUTE_ACTION);
} else if (userName != null) {
isSelected = authMan.isUserAuthorized(userName, child,
UserMgtConstants.EXECUTE_ACTION);
}
childNodes[i] = getUIPermissionNode(resource, isSelected);
if (resource instanceof Collection) {
buildUIPermissionNodeNotAllSelected((Collection) resource, childNodes[i],
registry, tenantRegistry, authMan, roleName, userName);
}
}
parentNode.setNodeList(childNodes);
}
开发者ID:wso2,项目名称:carbon-identity-framework,代码行数:37,代码来源:UserRealmProxy.java
示例19: testDeleteUser
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
@Test
public void testDeleteUser() throws Exception {
Registry registry = mock(Registry.class);
Mockito.when(realm.getRealmConfiguration()).thenReturn(this.getSampleRelaimConfiguration());
Mockito.when(realm.getAuthorizationManager()).thenReturn(authorizationManager);
Mockito.when(realm.getUserStoreManager()).thenReturn(userStoreManager);
Mockito.when(authorizationManager.
isUserAuthorized(anyString(), eq(PERMISSION),
eq(UserMgtConstants.EXECUTE_ACTION))).thenReturn(true);
userRealmProxy.deleteUser("testUser", registry);
verify(userStoreManager).deleteUser(anyString());
}
开发者ID:wso2,项目名称:carbon-identity-framework,代码行数:13,代码来源:UserRealmProxyTest.java
示例20: RegistryBasedLicenseManager
import org.wso2.carbon.registry.api.Registry; //导入依赖的package包/类
public RegistryBasedLicenseManager() {
Registry registry = CarbonContext.getThreadLocalCarbonContext().getRegistry(RegistryType.SYSTEM_GOVERNANCE);
if (registry == null) {
throw new IllegalArgumentException("Registry instance retrieved is null. Hence, " +
"'Registry based license manager cannot be initialized'");
}
try {
this.artifactManager = GenericArtifactManagerFactory.getTenantAwareGovernanceArtifactManager(registry);
} catch (LicenseManagementException e) {
throw new IllegalStateException("Failed to initialize generic artifact manager bound to " +
"Registry based license manager", e);
}
}
开发者ID:wso2,项目名称:carbon-device-mgt,代码行数:14,代码来源:RegistryBasedLicenseManager.java
注:本文中的org.wso2.carbon.registry.api.Registry类示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论