mirror of
https://repository.entgra.net/community/device-mgt-core.git
synced 2025-10-06 02:01:45 +00:00
Merge pull request #903 from Megala21/appm_new
Adding Application Release Management related changes.
This commit is contained in:
commit
98ff1179da
@ -24,6 +24,8 @@ import org.wso2.carbon.context.PrivilegedCarbonContext;
|
|||||||
import org.wso2.carbon.device.application.mgt.api.beans.ErrorResponse;
|
import org.wso2.carbon.device.application.mgt.api.beans.ErrorResponse;
|
||||||
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager;
|
import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.PlatformManager;
|
import org.wso2.carbon.device.application.mgt.common.services.PlatformManager;
|
||||||
|
|
||||||
@ -40,6 +42,8 @@ public class APIUtil {
|
|||||||
private static ApplicationManager applicationManager;
|
private static ApplicationManager applicationManager;
|
||||||
private static PlatformManager platformManager;
|
private static PlatformManager platformManager;
|
||||||
private static LifecycleStateManager lifecycleStateManager;
|
private static LifecycleStateManager lifecycleStateManager;
|
||||||
|
private static ApplicationReleaseManager applicationReleaseManager;
|
||||||
|
private static ApplicationStorageManager applicationStorageManager;
|
||||||
|
|
||||||
public static ApplicationManager getApplicationManager() {
|
public static ApplicationManager getApplicationManager() {
|
||||||
if (applicationManager == null) {
|
if (applicationManager == null) {
|
||||||
@ -96,6 +100,50 @@ public class APIUtil {
|
|||||||
return lifecycleStateManager;
|
return lifecycleStateManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To get the Application Release Manager from the osgi context.
|
||||||
|
*
|
||||||
|
* @return ApplicationRelease Manager instance in the current osgi context.
|
||||||
|
*/
|
||||||
|
public static ApplicationReleaseManager getApplicationReleaseManager() {
|
||||||
|
if (applicationReleaseManager == null) {
|
||||||
|
synchronized (APIUtil.class) {
|
||||||
|
if (applicationReleaseManager == null) {
|
||||||
|
PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
|
||||||
|
applicationReleaseManager = (ApplicationReleaseManager) ctx
|
||||||
|
.getOSGiService(ApplicationReleaseManager.class, null);
|
||||||
|
if (applicationReleaseManager == null) {
|
||||||
|
String msg = "Application Release Manager service has not initialized.";
|
||||||
|
log.error(msg);
|
||||||
|
throw new IllegalStateException(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return applicationReleaseManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To get the Application Storage Manager from the osgi context.
|
||||||
|
* @return ApplicationStoreManager instance in the current osgi context.
|
||||||
|
*/
|
||||||
|
public static ApplicationStorageManager getApplicationStorageManager() {
|
||||||
|
if (applicationStorageManager == null) {
|
||||||
|
synchronized (APIUtil.class) {
|
||||||
|
if (applicationStorageManager == null) {
|
||||||
|
PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
|
||||||
|
applicationStorageManager = (ApplicationStorageManager) ctx
|
||||||
|
.getOSGiService(ApplicationStorageManager.class, null);
|
||||||
|
if (applicationStorageManager == null) {
|
||||||
|
String msg = "Application Storage Manager service has not initialized.";
|
||||||
|
log.error(msg);
|
||||||
|
throw new IllegalStateException(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return applicationStorageManager;
|
||||||
|
}
|
||||||
public static Response getResponse(ApplicationManagementException ex, Response.Status status) {
|
public static Response getResponse(ApplicationManagementException ex, Response.Status status) {
|
||||||
return getResponse(ex.getMessage(), status);
|
return getResponse(ex.getMessage(), status);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
* Version 2.0 (the "License"); you may not use this file except
|
||||||
|
* in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.wso2.carbon.device.application.mgt.api;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import javax.ws.rs.WebApplicationException;
|
||||||
|
import javax.ws.rs.core.StreamingOutput;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FileStreamingOutput to allow the user to send the files as Stream.
|
||||||
|
*/
|
||||||
|
public class FileStreamingOutput implements StreamingOutput {
|
||||||
|
private InputStream inputStream;
|
||||||
|
|
||||||
|
public FileStreamingOutput(InputStream inputStream) {
|
||||||
|
this.inputStream = inputStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(OutputStream outputStream) throws IOException, WebApplicationException {
|
||||||
|
try {
|
||||||
|
byte[] buffer = new byte[inputStream.available()];
|
||||||
|
inputStream.read(buffer);
|
||||||
|
outputStream.write(buffer);
|
||||||
|
outputStream.flush();
|
||||||
|
} finally {
|
||||||
|
if (inputStream != null) {
|
||||||
|
inputStream.close();
|
||||||
|
}
|
||||||
|
if (outputStream != null) {
|
||||||
|
outputStream.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -23,6 +23,13 @@ import com.google.gson.Gson;
|
|||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
import org.wso2.carbon.device.application.mgt.common.jaxrs.AnnotationExclusionStrategy;
|
import org.wso2.carbon.device.application.mgt.common.jaxrs.AnnotationExclusionStrategy;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
import javax.ws.rs.Consumes;
|
import javax.ws.rs.Consumes;
|
||||||
import javax.ws.rs.Produces;
|
import javax.ws.rs.Produces;
|
||||||
import javax.ws.rs.WebApplicationException;
|
import javax.ws.rs.WebApplicationException;
|
||||||
@ -31,12 +38,12 @@ import javax.ws.rs.core.MultivaluedMap;
|
|||||||
import javax.ws.rs.ext.MessageBodyReader;
|
import javax.ws.rs.ext.MessageBodyReader;
|
||||||
import javax.ws.rs.ext.MessageBodyWriter;
|
import javax.ws.rs.ext.MessageBodyWriter;
|
||||||
import javax.ws.rs.ext.Provider;
|
import javax.ws.rs.ext.Provider;
|
||||||
import java.io.*;
|
|
||||||
import java.lang.annotation.Annotation;
|
|
||||||
import java.lang.reflect.Type;
|
|
||||||
|
|
||||||
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
|
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This provider is used to change a JSON object to complex object and inversely in request and response.
|
||||||
|
*/
|
||||||
@Provider
|
@Provider
|
||||||
@Produces(APPLICATION_JSON)
|
@Produces(APPLICATION_JSON)
|
||||||
@Consumes(APPLICATION_JSON)
|
@Consumes(APPLICATION_JSON)
|
||||||
|
|||||||
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
* Version 2.0 (the "License"); you may not use this file except
|
||||||
|
* in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.wso2.carbon.device.application.mgt.api;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonParser;
|
||||||
|
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.jaxrs.AnnotationExclusionStrategy;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.WebApplicationException;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.core.MultivaluedMap;
|
||||||
|
import javax.ws.rs.ext.MessageBodyReader;
|
||||||
|
import javax.ws.rs.ext.Provider;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provider for the text/plain type of input. Particularly use-ful for the complex objects sent along with Multipart
|
||||||
|
* request.
|
||||||
|
*/
|
||||||
|
@Provider
|
||||||
|
@Consumes(MediaType.TEXT_PLAIN)
|
||||||
|
public class MultipartCustomProvider implements MessageBodyReader<Object> {
|
||||||
|
private Gson gson;
|
||||||
|
|
||||||
|
public MultipartCustomProvider() {
|
||||||
|
final GsonBuilder gsonBuilder = new GsonBuilder().setDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz")
|
||||||
|
.setExclusionStrategies(new AnnotationExclusionStrategy());
|
||||||
|
gson = gsonBuilder.create();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean isReadable(Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType) {
|
||||||
|
return !aClass.equals(Attachment.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object readFrom(Class<Object> objectClass, Type type, Annotation[] annotations, MediaType mediaType,
|
||||||
|
MultivaluedMap<String, String> headers, InputStream inputStream) throws IOException,
|
||||||
|
WebApplicationException {
|
||||||
|
ByteArrayOutputStream result = new ByteArrayOutputStream();
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int length;
|
||||||
|
while ((length = inputStream.read(buffer)) != -1) {
|
||||||
|
result.write(buffer, 0, length);
|
||||||
|
}
|
||||||
|
String jsonString = result.toString();
|
||||||
|
JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
|
||||||
|
return gson.fromJson(obj, type);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -24,6 +24,9 @@ import io.swagger.annotations.ApiModelProperty;
|
|||||||
|
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a single error item in the error response.
|
||||||
|
*/
|
||||||
@ApiModel(description = "Error List Item")
|
@ApiModel(description = "Error List Item")
|
||||||
public class ErrorListItem {
|
public class ErrorListItem {
|
||||||
|
|
||||||
|
|||||||
@ -25,6 +25,10 @@ import io.swagger.annotations.ApiModelProperty;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This represents a response that need to be send back to the client, when the request cannot be completed
|
||||||
|
* successfully.
|
||||||
|
*/
|
||||||
@ApiModel(description = "Error Response")
|
@ApiModel(description = "Error Response")
|
||||||
public class ErrorResponse {
|
public class ErrorResponse {
|
||||||
|
|
||||||
|
|||||||
@ -28,11 +28,14 @@ import io.swagger.annotations.ExtensionProperty;
|
|||||||
import io.swagger.annotations.Info;
|
import io.swagger.annotations.Info;
|
||||||
import io.swagger.annotations.SwaggerDefinition;
|
import io.swagger.annotations.SwaggerDefinition;
|
||||||
import io.swagger.annotations.Tag;
|
import io.swagger.annotations.Tag;
|
||||||
|
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
|
||||||
|
import org.apache.cxf.jaxrs.ext.multipart.Multipart;
|
||||||
import org.wso2.carbon.apimgt.annotations.api.Scope;
|
import org.wso2.carbon.apimgt.annotations.api.Scope;
|
||||||
import org.wso2.carbon.apimgt.annotations.api.Scopes;
|
import org.wso2.carbon.apimgt.annotations.api.Scopes;
|
||||||
import org.wso2.carbon.device.application.mgt.api.beans.ErrorResponse;
|
import org.wso2.carbon.device.application.mgt.api.beans.ErrorResponse;
|
||||||
import org.wso2.carbon.device.application.mgt.common.Application;
|
import org.wso2.carbon.device.application.mgt.common.Application;
|
||||||
import org.wso2.carbon.device.application.mgt.common.ApplicationList;
|
import org.wso2.carbon.device.application.mgt.common.ApplicationList;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.ApplicationRelease;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
@ -106,7 +109,6 @@ import javax.ws.rs.core.Response;
|
|||||||
@Api(value = "Application Management", description = "This API carries all application management related operations " +
|
@Api(value = "Application Management", description = "This API carries all application management related operations " +
|
||||||
"such as get all the applications, add application, etc.")
|
"such as get all the applications, add application, etc.")
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
@Consumes(MediaType.APPLICATION_JSON)
|
|
||||||
public interface ApplicationManagementAPI {
|
public interface ApplicationManagementAPI {
|
||||||
|
|
||||||
String SCOPE = "scope";
|
String SCOPE = "scope";
|
||||||
@ -270,6 +272,82 @@ public interface ApplicationManagementAPI {
|
|||||||
required = true)
|
required = true)
|
||||||
@Valid Application application);
|
@Valid Application application);
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("upload-artifacts/{uuid}")
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
@Consumes(MediaType.MULTIPART_FORM_DATA)
|
||||||
|
@ApiOperation(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA,
|
||||||
|
produces = MediaType.APPLICATION_JSON,
|
||||||
|
httpMethod = "POST",
|
||||||
|
value = "Upload artifacts",
|
||||||
|
notes = "This will create a new application",
|
||||||
|
tags = "Application Management",
|
||||||
|
extensions = {
|
||||||
|
@Extension(properties = {
|
||||||
|
@ExtensionProperty(name = SCOPE, value = "perm:application:create")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiResponses(
|
||||||
|
value = {
|
||||||
|
@ApiResponse(
|
||||||
|
code = 201,
|
||||||
|
message = "OK. \n Successfully uploaded artifacts."),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 500,
|
||||||
|
message = "Internal Server Error. \n Error occurred while getting the application list.",
|
||||||
|
response = ErrorResponse.class)
|
||||||
|
})
|
||||||
|
Response uploadApplicationArtifacts(
|
||||||
|
@ApiParam(
|
||||||
|
name = "uuid",
|
||||||
|
value = "UUID of the application",
|
||||||
|
required = true)
|
||||||
|
@PathParam("uuid") String applicationUUID,
|
||||||
|
@Multipart(value = "icon") Attachment iconFile,
|
||||||
|
@Multipart(value = "banner") Attachment bannerFile,
|
||||||
|
@Multipart(value = "screenshot") List<Attachment> screenshots);
|
||||||
|
|
||||||
|
@PUT
|
||||||
|
@Path("upload-artifacts/{uuid}")
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
@Consumes(MediaType.MULTIPART_FORM_DATA)
|
||||||
|
@ApiOperation(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA,
|
||||||
|
produces = MediaType.APPLICATION_JSON,
|
||||||
|
httpMethod = "POST",
|
||||||
|
value = "Upload artifacts",
|
||||||
|
notes = "This will create a new application",
|
||||||
|
tags = "Application Management",
|
||||||
|
extensions = {
|
||||||
|
@Extension(properties = {
|
||||||
|
@ExtensionProperty(name = SCOPE, value = "perm:application:create")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiResponses(
|
||||||
|
value = {
|
||||||
|
@ApiResponse(
|
||||||
|
code = 201,
|
||||||
|
message = "OK. \n Successfully uploaded artifacts."),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 500,
|
||||||
|
message = "Internal Server Error. \n Error occurred while getting the application list.",
|
||||||
|
response = ErrorResponse.class)
|
||||||
|
})
|
||||||
|
Response updateApplicationArtifacts(
|
||||||
|
@ApiParam(
|
||||||
|
name = "uuid",
|
||||||
|
value = "UUID of the application",
|
||||||
|
required = true)
|
||||||
|
@PathParam("uuid") String applicationUUID,
|
||||||
|
@Multipart(value = "icon", required = false) Attachment iconFile,
|
||||||
|
@Multipart(value = "banner", required = false) Attachment bannerFile,
|
||||||
|
@Multipart(value = "screenshot", required = false) List<Attachment> screenshots);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@PUT
|
@PUT
|
||||||
@Consumes("application/json")
|
@Consumes("application/json")
|
||||||
@Path("/{uuid}/lifecycle")
|
@Path("/{uuid}/lifecycle")
|
||||||
@ -376,4 +454,121 @@ public interface ApplicationManagementAPI {
|
|||||||
value = "Unique identifier of the Application",
|
value = "Unique identifier of the Application",
|
||||||
required = true)
|
required = true)
|
||||||
@PathParam("appuuid") String applicationUUID);
|
@PathParam("appuuid") String applicationUUID);
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/release/{uuid}")
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
@Consumes(MediaType.MULTIPART_FORM_DATA)
|
||||||
|
@ApiOperation(
|
||||||
|
consumes = MediaType.MULTIPART_FORM_DATA,
|
||||||
|
produces = MediaType.APPLICATION_JSON,
|
||||||
|
httpMethod = "POST",
|
||||||
|
value = "Create an application release",
|
||||||
|
notes = "This will create a new application release",
|
||||||
|
tags = "Application Management",
|
||||||
|
extensions = {
|
||||||
|
@Extension(properties = {
|
||||||
|
@ExtensionProperty(name = SCOPE, value = "perm:application:create")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiResponses(
|
||||||
|
value = {
|
||||||
|
@ApiResponse(
|
||||||
|
code = 201,
|
||||||
|
message = "OK. \n Successfully created an application release.",
|
||||||
|
response = ApplicationRelease.class),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 500,
|
||||||
|
message = "Internal Server Error. \n Error occurred while releasing the application.",
|
||||||
|
response = ErrorResponse.class)
|
||||||
|
})
|
||||||
|
|
||||||
|
Response createApplicationRelease(
|
||||||
|
@ApiParam(
|
||||||
|
name = "UUID",
|
||||||
|
value = "Unique identifier of the Application",
|
||||||
|
required = true)
|
||||||
|
@PathParam("uuid") String applicationUUID,
|
||||||
|
@Multipart(value = "applicationRelease", type = "application/json") ApplicationRelease applicationRelease,
|
||||||
|
@Multipart(value = "binaryFile") Attachment binaryFile);
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/release-artifacts/{uuid}/{version}")
|
||||||
|
@Produces(MediaType.APPLICATION_OCTET_STREAM)
|
||||||
|
@Consumes(MediaType.MULTIPART_FORM_DATA)
|
||||||
|
@ApiOperation(
|
||||||
|
consumes = MediaType.APPLICATION_JSON,
|
||||||
|
produces = MediaType.APPLICATION_OCTET_STREAM,
|
||||||
|
httpMethod = "POST",
|
||||||
|
value = "Create an application release",
|
||||||
|
notes = "This will create a new application release",
|
||||||
|
tags = "Application Management",
|
||||||
|
extensions = {
|
||||||
|
@Extension(properties = {
|
||||||
|
@ExtensionProperty(name = SCOPE, value = "perm:application:get")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiResponses(
|
||||||
|
value = {
|
||||||
|
@ApiResponse(
|
||||||
|
code = 200,
|
||||||
|
message = "OK. \n Successfully retrieved the Application release.",
|
||||||
|
response = Attachment.class),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 500,
|
||||||
|
message = "Internal Server Error. \n Error occurred while releasing the application.",
|
||||||
|
response = ErrorResponse.class)
|
||||||
|
})
|
||||||
|
Response getApplicationReleaseArtifacts(
|
||||||
|
@ApiParam(
|
||||||
|
name = "UUID",
|
||||||
|
value = "Unique identifier of the Application",
|
||||||
|
required = true)
|
||||||
|
@PathParam("uuid") String applicationUUID,
|
||||||
|
@ApiParam(
|
||||||
|
name = "Version",
|
||||||
|
value = "Version of the Application release need to be retrieved",
|
||||||
|
required = true)
|
||||||
|
@PathParam("version") String version);
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/release/{uuid}")
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
@ApiOperation(
|
||||||
|
consumes = MediaType.APPLICATION_JSON,
|
||||||
|
produces = MediaType.APPLICATION_JSON,
|
||||||
|
httpMethod = "GET",
|
||||||
|
value = "Get all the releases or specific release of an application",
|
||||||
|
notes = "This will retrieve the all the releases or specific release of an application",
|
||||||
|
tags = "Application Management",
|
||||||
|
extensions = {
|
||||||
|
@Extension(properties = {
|
||||||
|
@ExtensionProperty(name = SCOPE, value = "perm:application:get")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiResponses(
|
||||||
|
value = {
|
||||||
|
@ApiResponse(
|
||||||
|
code = 200,
|
||||||
|
message = "OK. \n Successfully retrieved the Application release."),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 500,
|
||||||
|
message = "Internal Server Error. \n Error occurred while releasing the application.",
|
||||||
|
response = ErrorResponse.class)
|
||||||
|
})
|
||||||
|
Response getApplicationReleases(
|
||||||
|
@ApiParam(
|
||||||
|
name = "UUID",
|
||||||
|
value = "Unique identifier of the Application",
|
||||||
|
required = true)
|
||||||
|
@PathParam("uuid") String applicationUUID,
|
||||||
|
@ApiParam(
|
||||||
|
name = "version",
|
||||||
|
value = "Version of the application",
|
||||||
|
required = false)
|
||||||
|
@QueryParam("version") String version);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -31,8 +31,8 @@ import org.wso2.carbon.apimgt.annotations.api.Scopes;
|
|||||||
import org.wso2.carbon.device.application.mgt.api.beans.ErrorResponse;
|
import org.wso2.carbon.device.application.mgt.api.beans.ErrorResponse;
|
||||||
import org.wso2.carbon.device.application.mgt.common.Application;
|
import org.wso2.carbon.device.application.mgt.common.Application;
|
||||||
import org.wso2.carbon.device.application.mgt.common.LifecycleState;
|
import org.wso2.carbon.device.application.mgt.common.LifecycleState;
|
||||||
import org.wso2.carbon.device.application.mgt.common.Platform;
|
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import javax.ws.rs.Consumes;
|
import javax.ws.rs.Consumes;
|
||||||
import javax.ws.rs.GET;
|
import javax.ws.rs.GET;
|
||||||
import javax.ws.rs.Path;
|
import javax.ws.rs.Path;
|
||||||
@ -40,8 +40,10 @@ import javax.ws.rs.PathParam;
|
|||||||
import javax.ws.rs.Produces;
|
import javax.ws.rs.Produces;
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lifecycle management related APIs.
|
||||||
|
*/
|
||||||
@SwaggerDefinition(
|
@SwaggerDefinition(
|
||||||
info = @Info(
|
info = @Info(
|
||||||
version = "1.0.0",
|
version = "1.0.0",
|
||||||
@ -139,7 +141,8 @@ public interface LifecycleManagementAPI {
|
|||||||
@ApiResponse(
|
@ApiResponse(
|
||||||
code = 304,
|
code = 304,
|
||||||
message = "Not Modified. \n " +
|
message = "Not Modified. \n " +
|
||||||
"Empty body because the client already has the latest version of the requested resource."),
|
"Empty body because the client already has the latest version of the requested "
|
||||||
|
+ "resource."),
|
||||||
@ApiResponse(
|
@ApiResponse(
|
||||||
code = 500,
|
code = 500,
|
||||||
message = "Internal Server Error. \n Error occurred adding a lifecycle state.",
|
message = "Internal Server Error. \n Error occurred adding a lifecycle state.",
|
||||||
|
|||||||
@ -20,16 +20,27 @@ package org.wso2.carbon.device.application.mgt.api.services.impl;
|
|||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
|
||||||
|
import org.apache.cxf.jaxrs.ext.multipart.Multipart;
|
||||||
import org.wso2.carbon.device.application.mgt.api.APIUtil;
|
import org.wso2.carbon.device.application.mgt.api.APIUtil;
|
||||||
|
import org.wso2.carbon.device.application.mgt.api.FileStreamingOutput;
|
||||||
import org.wso2.carbon.device.application.mgt.api.services.ApplicationManagementAPI;
|
import org.wso2.carbon.device.application.mgt.api.services.ApplicationManagementAPI;
|
||||||
import org.wso2.carbon.device.application.mgt.common.Application;
|
import org.wso2.carbon.device.application.mgt.common.Application;
|
||||||
import org.wso2.carbon.device.application.mgt.common.ApplicationList;
|
import org.wso2.carbon.device.application.mgt.common.ApplicationList;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.ApplicationRelease;
|
||||||
import org.wso2.carbon.device.application.mgt.common.Filter;
|
import org.wso2.carbon.device.application.mgt.common.Filter;
|
||||||
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager;
|
||||||
import org.wso2.carbon.device.application.mgt.core.util.Constants;
|
import org.wso2.carbon.device.application.mgt.core.util.Constants;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import javax.ws.rs.Consumes;
|
import javax.ws.rs.Consumes;
|
||||||
import javax.ws.rs.DELETE;
|
import javax.ws.rs.DELETE;
|
||||||
@ -40,13 +51,14 @@ import javax.ws.rs.Path;
|
|||||||
import javax.ws.rs.PathParam;
|
import javax.ws.rs.PathParam;
|
||||||
import javax.ws.rs.Produces;
|
import javax.ws.rs.Produces;
|
||||||
import javax.ws.rs.QueryParam;
|
import javax.ws.rs.QueryParam;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of Application Management related APIs.
|
* Implementation of Application Management related APIs.
|
||||||
*/
|
*/
|
||||||
@Produces({"application/json"})
|
@Produces({"application/json"})
|
||||||
@Consumes({"application/json"})
|
|
||||||
@Path("/applications")
|
@Path("/applications")
|
||||||
public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
|
public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
|
||||||
|
|
||||||
@ -160,6 +172,92 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@POST
|
||||||
|
@Path("upload-image-artifacts/{uuid}")
|
||||||
|
public Response uploadApplicationArtifacts(@PathParam("uuid") String applicationUUID,
|
||||||
|
@Multipart("icon")Attachment iconFile, @Multipart("banner") Attachment bannerFile, @Multipart
|
||||||
|
("screenshot") List<Attachment> attachmentList) {
|
||||||
|
ApplicationStorageManager applicationStorageManager = APIUtil.getApplicationStorageManager();
|
||||||
|
try {
|
||||||
|
InputStream iconFileStream;
|
||||||
|
InputStream bannerFileStream;
|
||||||
|
List<InputStream> attachments = new ArrayList<>();
|
||||||
|
|
||||||
|
if (iconFile != null) {
|
||||||
|
iconFileStream = iconFile.getDataHandler().getInputStream();
|
||||||
|
} else {
|
||||||
|
throw new ApplicationManagementException(
|
||||||
|
"Icon file is not uploaded for the application " + applicationUUID);
|
||||||
|
}
|
||||||
|
if (bannerFile != null) {
|
||||||
|
bannerFileStream = bannerFile.getDataHandler().getInputStream();
|
||||||
|
} else {
|
||||||
|
throw new ApplicationManagementException(
|
||||||
|
"Banner file is not uploaded for the application " + applicationUUID);
|
||||||
|
}
|
||||||
|
if (attachmentList != null && !attachmentList.isEmpty()) {
|
||||||
|
for (Attachment screenshot : attachmentList) {
|
||||||
|
attachments.add(screenshot.getDataHandler().getInputStream());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new ApplicationManagementException(
|
||||||
|
"Screen-shot are not uploaded for the application " + applicationUUID);
|
||||||
|
}
|
||||||
|
applicationStorageManager
|
||||||
|
.uploadImageArtifacts(applicationUUID, iconFileStream, bannerFileStream, attachments);
|
||||||
|
return Response.status(Response.Status.OK)
|
||||||
|
.entity("Successfully uploaded artifacts for the application " + applicationUUID).build();
|
||||||
|
} catch (ApplicationManagementException e) {
|
||||||
|
String msg = "Error occurred while creating the application";
|
||||||
|
log.error(msg, e);
|
||||||
|
return APIUtil.getResponse(e, Response.Status.BAD_REQUEST);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Exception while trying to read icon, banner files for the application " + applicationUUID);
|
||||||
|
return APIUtil.getResponse(new ApplicationManagementException(
|
||||||
|
"Exception while trying to read icon, " + "banner files for the application " +
|
||||||
|
applicationUUID, e), Response.Status.BAD_REQUEST);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@PUT
|
||||||
|
@Path("upload-image-artifacts/{uuid}")
|
||||||
|
public Response updateApplicationArtifacts(@PathParam("uuid") String applicationUUID,
|
||||||
|
@Multipart("icon")Attachment iconFile, @Multipart("banner") Attachment bannerFile, @Multipart
|
||||||
|
("screenshot") List<Attachment> attachmentList) {
|
||||||
|
ApplicationStorageManager applicationStorageManager = APIUtil.getApplicationStorageManager();
|
||||||
|
try {
|
||||||
|
InputStream iconFileStream = null;
|
||||||
|
InputStream bannerFileStream = null;
|
||||||
|
List<InputStream> attachments = new ArrayList<>();
|
||||||
|
|
||||||
|
if (iconFile != null) {
|
||||||
|
iconFileStream = iconFile.getDataHandler().getInputStream();
|
||||||
|
}
|
||||||
|
if (bannerFile != null) {
|
||||||
|
bannerFileStream = bannerFile.getDataHandler().getInputStream();
|
||||||
|
}
|
||||||
|
if (attachmentList != null) {
|
||||||
|
for (Attachment screenshot : attachmentList) {
|
||||||
|
attachments.add(screenshot.getDataHandler().getInputStream());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
applicationStorageManager
|
||||||
|
.uploadImageArtifacts(applicationUUID, iconFileStream, bannerFileStream, attachments);
|
||||||
|
return Response.status(Response.Status.OK)
|
||||||
|
.entity("Successfully updated artifacts for the application " + applicationUUID).build();
|
||||||
|
} catch (ApplicationManagementException e) {
|
||||||
|
String msg = "Error occurred while updating the artifact for the application " + applicationUUID;
|
||||||
|
log.error(msg, e);
|
||||||
|
return APIUtil.getResponse(e, Response.Status.BAD_REQUEST);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Exception while trying to read icon, banner files for the application " + applicationUUID);
|
||||||
|
return APIUtil.getResponse(new ApplicationManagementException(
|
||||||
|
"Exception while trying to read icon, banner files for the application " +
|
||||||
|
applicationUUID, e), Response.Status.BAD_REQUEST);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@PUT
|
@PUT
|
||||||
@Consumes("application/json")
|
@Consumes("application/json")
|
||||||
@ -191,4 +289,79 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
|
|||||||
String responseMsg = "Successfully deleted the application: " + uuid;
|
String responseMsg = "Successfully deleted the application: " + uuid;
|
||||||
return Response.status(Response.Status.OK).entity(responseMsg).build();
|
return Response.status(Response.Status.OK).entity(responseMsg).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@POST
|
||||||
|
@Path("/release/{uuid}")
|
||||||
|
public Response createApplicationRelease(@PathParam("uuid") String applicationUUID,
|
||||||
|
@Multipart("applicationRelease") ApplicationRelease applicationRelease,
|
||||||
|
@Multipart("binaryFile") Attachment binaryFile) {
|
||||||
|
ApplicationReleaseManager applicationReleaseManager = APIUtil.getApplicationReleaseManager();
|
||||||
|
ApplicationStorageManager applicationStorageManager = APIUtil.getApplicationStorageManager();
|
||||||
|
try {
|
||||||
|
applicationRelease = applicationReleaseManager.createRelease(applicationUUID, applicationRelease);
|
||||||
|
|
||||||
|
if (binaryFile != null) {
|
||||||
|
applicationStorageManager.uploadReleaseArtifacts(applicationUUID, applicationRelease.getVersionName(),
|
||||||
|
binaryFile.getDataHandler().getInputStream());
|
||||||
|
}
|
||||||
|
return Response.status(Response.Status.CREATED).entity(applicationRelease).build();
|
||||||
|
} catch (ApplicationManagementException e) {
|
||||||
|
log.error("Error while creating an application release for the application with UUID " + applicationUUID,
|
||||||
|
e);
|
||||||
|
return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR);
|
||||||
|
} catch (IOException e) {
|
||||||
|
String errorMessage =
|
||||||
|
"Error while uploading binary file for the application release of the application with UUID "
|
||||||
|
+ applicationUUID;
|
||||||
|
log.error(errorMessage, e);
|
||||||
|
return APIUtil.getResponse(new ApplicationManagementException(errorMessage, e),
|
||||||
|
Response.Status.INTERNAL_SERVER_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@GET
|
||||||
|
@Produces(MediaType.APPLICATION_OCTET_STREAM)
|
||||||
|
@Path("/release-artifacts/{uuid}/{version}")
|
||||||
|
public Response getApplicationReleaseArtifacts(@PathParam("uuid") String applicationUUID,
|
||||||
|
@PathParam("version") String version) {
|
||||||
|
ApplicationStorageManager applicationStorageManager = APIUtil.getApplicationStorageManager();
|
||||||
|
try {
|
||||||
|
InputStream binaryFile = applicationStorageManager.getReleasedArtifacts(applicationUUID, version);
|
||||||
|
FileStreamingOutput fileStreamingOutput = new FileStreamingOutput(binaryFile);
|
||||||
|
Response.ResponseBuilder response = Response.status(Response.Status.OK).entity(fileStreamingOutput);
|
||||||
|
response.header("Content-Disposition", "attachment; filename=\"" + version + "\"");
|
||||||
|
return response.build();
|
||||||
|
} catch (ApplicationStorageManagementException e) {
|
||||||
|
log.error("Error while retrieving the binary file of the applcation release for the application UUID " +
|
||||||
|
applicationUUID + " and version " + version, e);
|
||||||
|
if (e.getMessage().contains("Binary file does not exist")) {
|
||||||
|
return APIUtil.getResponse(e, Response.Status.NOT_FOUND);
|
||||||
|
} else {
|
||||||
|
return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Path("/release/{uuid}")
|
||||||
|
@GET
|
||||||
|
public Response getApplicationReleases(@PathParam("uuid") String applicationUUID,
|
||||||
|
@QueryParam("version") String version) {
|
||||||
|
ApplicationReleaseManager applicationReleaseManager = APIUtil.getApplicationReleaseManager();
|
||||||
|
try {
|
||||||
|
if (version == null || version.isEmpty()) {
|
||||||
|
List<ApplicationRelease> applicationReleases = applicationReleaseManager.getReleases(applicationUUID);
|
||||||
|
return Response.status(Response.Status.OK).entity(applicationReleases).build();
|
||||||
|
} else {
|
||||||
|
ApplicationRelease applicationRelease = applicationReleaseManager.getRelease(applicationUUID, version);
|
||||||
|
return Response.status(Response.Status.OK).entity(applicationRelease).build();
|
||||||
|
}
|
||||||
|
} catch (ApplicationManagementException e) {
|
||||||
|
log.error("Error while getting all the application releases for the application with the UUID "
|
||||||
|
+ applicationUUID, e);
|
||||||
|
return APIUtil.getResponse(e, Response.Status.INTERNAL_SERVER_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,15 +25,18 @@ import org.wso2.carbon.device.application.mgt.common.LifecycleState;
|
|||||||
import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManagementException;
|
import org.wso2.carbon.device.application.mgt.common.exception.LifecycleManagementException;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager;
|
import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import javax.ws.rs.DELETE;
|
import javax.ws.rs.DELETE;
|
||||||
import javax.ws.rs.GET;
|
import javax.ws.rs.GET;
|
||||||
import javax.ws.rs.POST;
|
import javax.ws.rs.POST;
|
||||||
import javax.ws.rs.Path;
|
import javax.ws.rs.Path;
|
||||||
import javax.ws.rs.PathParam;
|
import javax.ws.rs.PathParam;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lifecycle Management related jax-rs APIs.
|
||||||
|
*/
|
||||||
@Path("/lifecycles")
|
@Path("/lifecycles")
|
||||||
public class LifecycleManagementAPIImpl implements LifecycleManagementAPI {
|
public class LifecycleManagementAPIImpl implements LifecycleManagementAPI {
|
||||||
|
|
||||||
|
|||||||
@ -31,6 +31,7 @@ http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
|
|||||||
</jaxrs:serviceBeans>
|
</jaxrs:serviceBeans>
|
||||||
<jaxrs:providers>
|
<jaxrs:providers>
|
||||||
<ref bean="jsonProvider"/>
|
<ref bean="jsonProvider"/>
|
||||||
|
<ref bean="multipartProvider"/>
|
||||||
</jaxrs:providers>
|
</jaxrs:providers>
|
||||||
</jaxrs:server>
|
</jaxrs:server>
|
||||||
|
|
||||||
@ -38,6 +39,7 @@ http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
|
|||||||
<bean id="platformMgtServiceBean" class="org.wso2.carbon.device.application.mgt.api.services.impl.PlatformManagementAPIImpl" />
|
<bean id="platformMgtServiceBean" class="org.wso2.carbon.device.application.mgt.api.services.impl.PlatformManagementAPIImpl" />
|
||||||
<bean id="lifecycleMgtServiceBean" class="org.wso2.carbon.device.application.mgt.api.services.impl.LifecycleManagementAPIImpl" />
|
<bean id="lifecycleMgtServiceBean" class="org.wso2.carbon.device.application.mgt.api.services.impl.LifecycleManagementAPIImpl" />
|
||||||
<bean id="jsonProvider" class="org.wso2.carbon.device.application.mgt.api.JSONMessageHandler"/>
|
<bean id="jsonProvider" class="org.wso2.carbon.device.application.mgt.api.JSONMessageHandler"/>
|
||||||
|
<bean id="multipartProvider" class="org.wso2.carbon.device.application.mgt.api.MultipartCustomProvider"/>
|
||||||
|
|
||||||
</beans>
|
</beans>
|
||||||
|
|
||||||
|
|||||||
@ -26,7 +26,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Application represents the an Application in Application Store
|
* Application represents the an Application in Application Store.
|
||||||
*/
|
*/
|
||||||
public class Application {
|
public class Application {
|
||||||
|
|
||||||
@ -250,4 +250,10 @@ public class Application {
|
|||||||
public void setUser(User user) {
|
public void setUser(User user) {
|
||||||
this.user = user;
|
this.user = user;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "UUID : " + uuid + "\tIdentifier : " + identifier + "\tName : " + name + "\tShort Description : "
|
||||||
|
+ shortDescription + "\tLifecycle State : " + currentLifecycle.getLifecycleState();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,6 +18,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.application.mgt.common;
|
package org.wso2.carbon.device.application.mgt.common;
|
||||||
|
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.jaxrs.Exclude;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -30,6 +32,7 @@ public class ApplicationRelease {
|
|||||||
PRODUCTION, ALPHA, BETA
|
PRODUCTION, ALPHA, BETA
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Exclude
|
||||||
private int id;
|
private int id;
|
||||||
|
|
||||||
private int versionId;
|
private int versionId;
|
||||||
@ -46,10 +49,6 @@ public class ApplicationRelease {
|
|||||||
|
|
||||||
private Application application;
|
private Application application;
|
||||||
|
|
||||||
private Date lifecycleStateModifiedAt;
|
|
||||||
|
|
||||||
private String lifecycleStateModifiedBy;
|
|
||||||
|
|
||||||
private Map<String, String> properties;
|
private Map<String, String> properties;
|
||||||
|
|
||||||
private boolean isDefault;
|
private boolean isDefault;
|
||||||
@ -62,14 +61,6 @@ public class ApplicationRelease {
|
|||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getVersionId() {
|
|
||||||
return versionId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setVersionId(int versionId) {
|
|
||||||
this.versionId = versionId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getVersionName() {
|
public String getVersionName() {
|
||||||
return versionName;
|
return versionName;
|
||||||
}
|
}
|
||||||
@ -90,8 +81,8 @@ public class ApplicationRelease {
|
|||||||
return releaseChannel;
|
return releaseChannel;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setReleaseChannel(Channel releaseChannel) {
|
public void setReleaseChannel(String releaseChannel) {
|
||||||
this.releaseChannel = releaseChannel;
|
this.releaseChannel = Channel.valueOf(releaseChannel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getReleaseDetails() {
|
public String getReleaseDetails() {
|
||||||
@ -118,22 +109,6 @@ public class ApplicationRelease {
|
|||||||
this.application = application;
|
this.application = application;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Date getLifecycleStateModifiedAt() {
|
|
||||||
return lifecycleStateModifiedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLifecycleStateModifiedAt(Date lifecycleStateModifiedAt) {
|
|
||||||
this.lifecycleStateModifiedAt = lifecycleStateModifiedAt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getLifecycleStateModifiedBy() {
|
|
||||||
return lifecycleStateModifiedBy;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLifecycleStateModifiedBy(String lifecycleStateModifiedBy) {
|
|
||||||
this.lifecycleStateModifiedBy = lifecycleStateModifiedBy;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, String> getProperties() {
|
public Map<String, String> getProperties() {
|
||||||
return properties;
|
return properties;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,8 +22,7 @@ package org.wso2.carbon.device.application.mgt.common.exception;
|
|||||||
* Represents the exception thrown during application management.
|
* Represents the exception thrown during application management.
|
||||||
*/
|
*/
|
||||||
public class ApplicationManagementException extends Exception {
|
public class ApplicationManagementException extends Exception {
|
||||||
|
private String message;
|
||||||
String message;
|
|
||||||
|
|
||||||
public ApplicationManagementException(String message, Throwable throwable) {
|
public ApplicationManagementException(String message, Throwable throwable) {
|
||||||
super(message, throwable);
|
super(message, throwable);
|
||||||
|
|||||||
@ -16,11 +16,18 @@
|
|||||||
* under the License.
|
* under the License.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.application.mgt.common.services;
|
|
||||||
|
package org.wso2.carbon.device.application.mgt.common.exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This interface manages all the operations related with Application Upload.
|
* Represents the exception thrown during storing and retrieving the artifacts.
|
||||||
*/
|
*/
|
||||||
public interface ApplicationUploadManager {
|
public class ApplicationStorageManagementException extends ApplicationManagementException {
|
||||||
|
public ApplicationStorageManagementException(String message, Throwable ex) {
|
||||||
|
super(message, ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApplicationStorageManagementException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -18,7 +18,10 @@
|
|||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.application.mgt.common.services;
|
package org.wso2.carbon.device.application.mgt.common.services;
|
||||||
|
|
||||||
import org.wso2.carbon.device.application.mgt.common.*;
|
import org.wso2.carbon.device.application.mgt.common.Application;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.ApplicationList;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.Filter;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.LifecycleStateTransition;
|
||||||
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -62,11 +65,11 @@ public interface ApplicationManager {
|
|||||||
/**
|
/**
|
||||||
* To change the lifecycle of the Application.
|
* To change the lifecycle of the Application.
|
||||||
*
|
*
|
||||||
* @param applicationUUID UUID of the Application
|
* @param applicationUuid UUID of the Application
|
||||||
* @param lifecycleIdentifier New life-cycle that need to be changed.
|
* @param lifecycleIdentifier New life-cycle that need to be changed.
|
||||||
* @throws ApplicationManagementException Application Management Exception.
|
* @throws ApplicationManagementException Application Management Exception.
|
||||||
*/
|
*/
|
||||||
public void changeLifecycle(String applicationUUID, String lifecycleIdentifier) throws
|
public void changeLifecycle(String applicationUuid, String lifecycleIdentifier) throws
|
||||||
ApplicationManagementException;
|
ApplicationManagementException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -88,4 +91,5 @@ public interface ApplicationManager {
|
|||||||
*/
|
*/
|
||||||
public Application getApplication(String uuid) throws ApplicationManagementException;
|
public Application getApplication(String uuid) throws ApplicationManagementException;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,6 +18,11 @@
|
|||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.application.mgt.common.services;
|
package org.wso2.carbon.device.application.mgt.common.services;
|
||||||
|
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.ApplicationRelease;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ApplicationReleaseManager is responsible for handling all the operations related with
|
* ApplicationReleaseManager is responsible for handling all the operations related with
|
||||||
* {@link org.wso2.carbon.device.application.mgt.common.ApplicationRelease} which involving addition, updation ,
|
* {@link org.wso2.carbon.device.application.mgt.common.ApplicationRelease} which involving addition, updation ,
|
||||||
@ -26,4 +31,45 @@ package org.wso2.carbon.device.application.mgt.common.services;
|
|||||||
*/
|
*/
|
||||||
public interface ApplicationReleaseManager {
|
public interface ApplicationReleaseManager {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To create an application release for an Application.
|
||||||
|
*
|
||||||
|
* @param appicationUuid UUID of the Application
|
||||||
|
* @param applicationRelease ApplicatonRelease that need to be be created.
|
||||||
|
* @return the unique id of the application release, if the application release succeeded else -1
|
||||||
|
*/
|
||||||
|
public ApplicationRelease createRelease(String appicationUuid, ApplicationRelease applicationRelease) throws
|
||||||
|
ApplicationManagementException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To get the application release of the Application/
|
||||||
|
* @param applicationUuid UUID of the Application.
|
||||||
|
* @param version Version of the ApplicationRelease that need to be retrieved.
|
||||||
|
* @return ApplicationRelease related with particular Application UUID and version.
|
||||||
|
* @throws ApplicationManagementException ApplicationManagementException
|
||||||
|
*/
|
||||||
|
public ApplicationRelease getRelease(String applicationUuid, String version) throws ApplicationManagementException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To get all the releases of a particular Application.
|
||||||
|
* @param applicationUuid UUID of the Application to get all the releases.
|
||||||
|
* @return the List of the Application releases related with the particular Application.
|
||||||
|
* @throws ApplicationManagementException Application Management Exception.
|
||||||
|
*/
|
||||||
|
public List<ApplicationRelease> getReleases(String applicationUuid) throws ApplicationManagementException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To make a release as the default one for an application.
|
||||||
|
*
|
||||||
|
* @param id ID of the ApplicationRelease, that need to be made default.
|
||||||
|
*/
|
||||||
|
public void makeDefaultRelease(int id) throws ApplicationManagementException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To update with a new release for an Application.
|
||||||
|
*
|
||||||
|
* @param applicationRelease ApplicationRelease
|
||||||
|
* @throws ApplicationManagementException Application Management Exception.
|
||||||
|
*/
|
||||||
|
public void updateRelease(ApplicationRelease applicationRelease) throws ApplicationManagementException;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
* Version 2.0 (the "License"); you may not use this file except
|
||||||
|
* in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.wso2.carbon.device.application.mgt.common.services;
|
||||||
|
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This manages all the storage related requirements of Application.
|
||||||
|
*/
|
||||||
|
public interface ApplicationStorageManager {
|
||||||
|
/**
|
||||||
|
* To upload image artifacts related with an Application.
|
||||||
|
*
|
||||||
|
* @param applicationUUID UUID of the application
|
||||||
|
* @param iconFile Icon File input stream
|
||||||
|
* @param bannerFile Banner File input stream
|
||||||
|
* @throws ApplicationStorageManagementException Application Storage Management Exception.
|
||||||
|
*/
|
||||||
|
public void uploadImageArtifacts(String applicationUUID, InputStream iconFile, InputStream bannerFile,
|
||||||
|
List<InputStream> screenshots) throws ApplicationStorageManagementException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To upload release artifacts for an Application.
|
||||||
|
* @param applicationUUID UUID of the application related with the release.
|
||||||
|
* @param versionName Name of version of the Applcation Release.
|
||||||
|
* @param binaryFile Binary File for the release.
|
||||||
|
* @throws ApplicationStorageManagementException Application Storage Management Exception.
|
||||||
|
*/
|
||||||
|
public void uploadReleaseArtifacts(String applicationUUID, String versionName, InputStream binaryFile) throws
|
||||||
|
ApplicationStorageManagementException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To get released artifacts for the particular version of the application.
|
||||||
|
* @param applicationUUID UUID of the Application
|
||||||
|
* @param versionName Version of the release to be retrieved
|
||||||
|
* @return the artifact related with the Application Release.
|
||||||
|
* @throws ApplicationStorageManagementException Application Storage Management Exception.
|
||||||
|
*/
|
||||||
|
public InputStream getReleasedArtifacts(String applicationUUID, String versionName) throws
|
||||||
|
ApplicationStorageManagementException;
|
||||||
|
}
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
* Version 2.0 (the "License"); you may not use this file except
|
||||||
|
* in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package org.wso2.carbon.device.application.mgt.core.config;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This represents Artifacts element in application-mgt configuration file.
|
||||||
|
*/
|
||||||
|
@XmlRootElement(name = "Artifacts")
|
||||||
|
public class Artifacts {
|
||||||
|
private String imageLocation;
|
||||||
|
private String binaryLocation;
|
||||||
|
|
||||||
|
@XmlElement(name = "ImageLocation", required = true)
|
||||||
|
public String getImageLocation() {
|
||||||
|
return imageLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImageLocation(String imageLocation) {
|
||||||
|
this.imageLocation = imageLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement(name = "BinaryLocation", required = true)
|
||||||
|
public String getBinaryLocation() {
|
||||||
|
return binaryLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBinaryLocation(String binaryLocation) {
|
||||||
|
this.binaryLocation = binaryLocation;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -33,6 +33,8 @@ public class Configuration {
|
|||||||
|
|
||||||
private List<Extension> extensions;
|
private List<Extension> extensions;
|
||||||
|
|
||||||
|
private Artifacts artifacts;
|
||||||
|
|
||||||
@XmlElement(name = "DatasourceName", required = true)
|
@XmlElement(name = "DatasourceName", required = true)
|
||||||
public String getDatasourceName() {
|
public String getDatasourceName() {
|
||||||
return datasourceName;
|
return datasourceName;
|
||||||
@ -51,6 +53,15 @@ public class Configuration {
|
|||||||
public void setExtensions(List<Extension> extensions) {
|
public void setExtensions(List<Extension> extensions) {
|
||||||
this.extensions = extensions;
|
this.extensions = extensions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@XmlElement(name = "Artifacts")
|
||||||
|
public Artifacts getArtifacts() {
|
||||||
|
return artifacts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setArtifacts(Artifacts artifacts) {
|
||||||
|
this.artifacts = artifacts;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -87,7 +87,8 @@ public class Extension {
|
|||||||
PlatformManager,
|
PlatformManager,
|
||||||
VisibilityTypeManager,
|
VisibilityTypeManager,
|
||||||
SubscriptionManager,
|
SubscriptionManager,
|
||||||
VisibilityManager
|
VisibilityManager,
|
||||||
|
ApplicationStorageManager
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -18,9 +18,42 @@
|
|||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.application.mgt.core.dao;
|
package org.wso2.carbon.device.application.mgt.core.dao;
|
||||||
|
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.ApplicationRelease;
|
||||||
|
import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is responsible for Application Release related DAO operations.
|
* This is responsible for Application Release related DAO operations.
|
||||||
*/
|
*/
|
||||||
public interface ApplicationReleaseDAO {
|
public interface ApplicationReleaseDAO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To create an Application release.
|
||||||
|
*
|
||||||
|
* @param applicationRelease Application Release that need to be created.
|
||||||
|
* @return Unique ID of the relevant release.
|
||||||
|
* @throws ApplicationManagementDAOException Application Management DAO Exception.
|
||||||
|
*/
|
||||||
|
ApplicationRelease createRelease(ApplicationRelease applicationRelease) throws
|
||||||
|
ApplicationManagementDAOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To get a release details with the particular version.
|
||||||
|
* @param applicationUuid UUID of the application to get the release.
|
||||||
|
* @param versionName Name of the version
|
||||||
|
* @return ApplicationRelease for the particular version of the given application
|
||||||
|
* @throws ApplicationManagementDAOException Application Management DAO Exception.
|
||||||
|
*/
|
||||||
|
ApplicationRelease getRelease(String applicationUuid, String versionName) throws ApplicationManagementDAOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To get all the releases of a particular application.
|
||||||
|
*
|
||||||
|
* @param applicationUUID Application UUID
|
||||||
|
* @return list of the application releases
|
||||||
|
* @throws ApplicationManagementDAOException Application Management DAO Exception.
|
||||||
|
*/
|
||||||
|
List<ApplicationRelease> getApplicationReleases(String applicationUUID) throws ApplicationManagementDAOException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,6 +24,9 @@ import org.wso2.carbon.device.application.mgt.core.exception.DAOException;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is responsible for all the DAO operations related to Lifecycle state.
|
||||||
|
*/
|
||||||
public interface LifecycleStateDAO {
|
public interface LifecycleStateDAO {
|
||||||
|
|
||||||
LifecycleState getLifeCycleStateByIdentifier(String identifier) throws ApplicationManagementDAOException;
|
LifecycleState getLifeCycleStateByIdentifier(String identifier) throws ApplicationManagementDAOException;
|
||||||
|
|||||||
@ -23,9 +23,11 @@ import org.apache.commons.logging.LogFactory;
|
|||||||
import org.wso2.carbon.device.application.mgt.common.exception.UnsupportedDatabaseEngineException;
|
import org.wso2.carbon.device.application.mgt.common.exception.UnsupportedDatabaseEngineException;
|
||||||
import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager;
|
import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager;
|
||||||
import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO;
|
import org.wso2.carbon.device.application.mgt.core.dao.ApplicationDAO;
|
||||||
|
import org.wso2.carbon.device.application.mgt.core.dao.ApplicationReleaseDAO;
|
||||||
import org.wso2.carbon.device.application.mgt.core.dao.LifecycleStateDAO;
|
import org.wso2.carbon.device.application.mgt.core.dao.LifecycleStateDAO;
|
||||||
import org.wso2.carbon.device.application.mgt.core.dao.PlatformDAO;
|
import org.wso2.carbon.device.application.mgt.core.dao.PlatformDAO;
|
||||||
import org.wso2.carbon.device.application.mgt.core.dao.impl.application.GenericApplicationDAOImpl;
|
import org.wso2.carbon.device.application.mgt.core.dao.impl.application.GenericApplicationDAOImpl;
|
||||||
|
import org.wso2.carbon.device.application.mgt.core.dao.impl.application.release.GenericApplicationReleaseDAOImpl;
|
||||||
import org.wso2.carbon.device.application.mgt.core.dao.impl.lifecyclestate.GenericLifecycleStateImpl;
|
import org.wso2.carbon.device.application.mgt.core.dao.impl.lifecyclestate.GenericLifecycleStateImpl;
|
||||||
import org.wso2.carbon.device.application.mgt.core.dao.impl.platform.GenericPlatformDAOImpl;
|
import org.wso2.carbon.device.application.mgt.core.dao.impl.platform.GenericPlatformDAOImpl;
|
||||||
import org.wso2.carbon.device.application.mgt.core.dao.impl.platform.OracleMsSQLPlatformDAOImpl;
|
import org.wso2.carbon.device.application.mgt.core.dao.impl.platform.OracleMsSQLPlatformDAOImpl;
|
||||||
@ -96,6 +98,23 @@ public class DAOFactory {
|
|||||||
throw new IllegalStateException("Database engine has not initialized properly.");
|
throw new IllegalStateException("Database engine has not initialized properly.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To get the instance of ApplicationReleaseDAOImplementation of the particular database engine.
|
||||||
|
* @return specific ApplicationReleaseDAOImplementation
|
||||||
|
*/
|
||||||
|
public static ApplicationReleaseDAO getApplicationReleaseDAO() {
|
||||||
|
if (databaseEngine != null) {
|
||||||
|
switch (databaseEngine) {
|
||||||
|
case Constants.DataBaseTypes.DB_TYPE_H2:
|
||||||
|
case Constants.DataBaseTypes.DB_TYPE_MYSQL:
|
||||||
|
return new GenericApplicationReleaseDAOImpl();
|
||||||
|
default:
|
||||||
|
throw new UnsupportedDatabaseEngineException("Unsupported database engine : " + databaseEngine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new IllegalStateException("Database engine has not initialized properly.");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method initializes the databases by creating the database.
|
* This method initializes the databases by creating the database.
|
||||||
*
|
*
|
||||||
|
|||||||
@ -23,6 +23,9 @@ import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil;
|
|||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class deals with getting the DB connection.
|
||||||
|
*/
|
||||||
public abstract class AbstractDAOImpl {
|
public abstract class AbstractDAOImpl {
|
||||||
|
|
||||||
protected Connection getDBConnection() throws DBConnectionException {
|
protected Connection getDBConnection() throws DBConnectionException {
|
||||||
|
|||||||
@ -0,0 +1,208 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
* Version 2.0 (the "License"); you may not use this file except
|
||||||
|
* in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.wso2.carbon.device.application.mgt.core.dao.impl.application.release;
|
||||||
|
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.ApplicationRelease;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException;
|
||||||
|
import org.wso2.carbon.device.application.mgt.core.dao.ApplicationReleaseDAO;
|
||||||
|
import org.wso2.carbon.device.application.mgt.core.dao.common.Util;
|
||||||
|
import org.wso2.carbon.device.application.mgt.core.dao.impl.AbstractDAOImpl;
|
||||||
|
import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException;
|
||||||
|
import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.Date;
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GenericApplicationReleaseDAOImpl holds the implementation of ApplicationRelease related DAO operations.
|
||||||
|
*/
|
||||||
|
public class GenericApplicationReleaseDAOImpl extends AbstractDAOImpl implements ApplicationReleaseDAO {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ApplicationRelease createRelease(ApplicationRelease applicationRelease) throws
|
||||||
|
ApplicationManagementDAOException {
|
||||||
|
Connection connection;
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
ResultSet resultSet = null;
|
||||||
|
String sql = "insert into APPM_APPLICATION_RELEASE(VERSION_NAME, RESOURCE, RELEASE_CHANNEL ,"
|
||||||
|
+ "RELEASE_DETAILS, CREATED_AT, APPM_APPLICATION_ID, IS_DEFAULT) values (?, ?, ?, ?, ?, ?, ?)";
|
||||||
|
int index = 0;
|
||||||
|
boolean isBatchExecutionSupported = ConnectionManagerUtil.isBatchQuerySupported();
|
||||||
|
|
||||||
|
try {
|
||||||
|
connection = this.getDBConnection();
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
statement.setString(++index, applicationRelease.getVersionName());
|
||||||
|
statement.setString(++index, applicationRelease.getResource());
|
||||||
|
statement.setString(++index, String.valueOf(applicationRelease.getReleaseChannel()));
|
||||||
|
statement.setString(++index, applicationRelease.getReleaseDetails());
|
||||||
|
statement.setDate(++index, new Date(applicationRelease.getCreatedAt().getTime()));
|
||||||
|
statement.setInt(++index, applicationRelease.getApplication().getId());
|
||||||
|
statement.setBoolean(++index, applicationRelease.isDefault());
|
||||||
|
statement.executeUpdate();
|
||||||
|
resultSet = statement.getGeneratedKeys();
|
||||||
|
if (resultSet.next()) {
|
||||||
|
applicationRelease.setId(resultSet.getInt(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (applicationRelease.getProperties() != null && applicationRelease.getProperties().size() != 0) {
|
||||||
|
sql = "INSERT INTO APPM_RELEASE_PROPERTY (PROP_KEY, PROP_VALUE, APPLICATION_RELEASE_ID) VALUES (?,?,?)";
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
for (Object entry : applicationRelease.getProperties().entrySet()) {
|
||||||
|
Map.Entry<String, String> property = (Map.Entry) entry;
|
||||||
|
statement.setString(1, property.getKey());
|
||||||
|
statement.setString(2, property.getValue());
|
||||||
|
statement.setInt(3, applicationRelease.getId());
|
||||||
|
if (isBatchExecutionSupported) {
|
||||||
|
statement.addBatch();
|
||||||
|
} else {
|
||||||
|
statement.execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isBatchExecutionSupported) {
|
||||||
|
statement.executeBatch();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return applicationRelease;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new ApplicationManagementDAOException(
|
||||||
|
"SQL Exception while trying to release an application (UUID : " + applicationRelease
|
||||||
|
.getApplication().getUuid() + "), by executing the query " + sql, e);
|
||||||
|
} catch (DBConnectionException e) {
|
||||||
|
throw new ApplicationManagementDAOException(
|
||||||
|
"Database Connection Exception while trying to release the " + "applcation with UUID "
|
||||||
|
+ applicationRelease.getApplication().getUuid(), e);
|
||||||
|
} finally {
|
||||||
|
Util.cleanupResources(statement, resultSet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ApplicationRelease getRelease(String applicationUuid, String versionName)
|
||||||
|
throws ApplicationManagementDAOException {
|
||||||
|
Connection connection;
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
ResultSet resultSet = null;
|
||||||
|
String sql = "SELECT * FROM APPM_APPLICATION_RELEASE WHERE VERSION_NAME = ? AND APPM_APPLICATION_ID = "
|
||||||
|
+ "(SELECT ID FROM APPM_APPLICATION WHERE UUID = ?)";
|
||||||
|
ApplicationRelease applicationRelease = null;
|
||||||
|
ResultSet rsProperties = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
connection = this.getDBConnection();
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
statement.setString(1, versionName);
|
||||||
|
statement.setString(2, applicationUuid);
|
||||||
|
resultSet = statement.executeQuery();
|
||||||
|
|
||||||
|
if (resultSet.next()) {
|
||||||
|
applicationRelease = new ApplicationRelease();
|
||||||
|
applicationRelease.setVersionName(versionName);
|
||||||
|
applicationRelease.setDefault(resultSet.getBoolean("IS_DEFAULT"));
|
||||||
|
applicationRelease.setCreatedAt(resultSet.getDate("CREATED_AT"));
|
||||||
|
applicationRelease.setReleaseChannel(resultSet.getString("RELEASE_CHANNEL"));
|
||||||
|
applicationRelease.setReleaseDetails(resultSet.getString("RELEASE_DETAILS"));
|
||||||
|
applicationRelease.setResource(resultSet.getString("RESOURCE"));
|
||||||
|
|
||||||
|
sql = "SELECT * FROM APPM_RELEASE_PROPERTY WHERE APPLICATION_RELEASE_ID=?";
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
statement.setInt(1, resultSet.getInt("ID"));
|
||||||
|
rsProperties = statement.executeQuery();
|
||||||
|
|
||||||
|
Map<String, String> properties = new HashMap<>();
|
||||||
|
while (rsProperties.next()) {
|
||||||
|
properties.put(rsProperties.getString("PROP_KEY"),
|
||||||
|
rsProperties.getString("PROP_VAL"));
|
||||||
|
}
|
||||||
|
applicationRelease.setProperties(properties);
|
||||||
|
}
|
||||||
|
return applicationRelease;
|
||||||
|
} catch (DBConnectionException e) {
|
||||||
|
throw new ApplicationManagementDAOException("Database connection exception while trying to gett the "
|
||||||
|
+ "release details of the application with UUID " + applicationUuid + " and version " +
|
||||||
|
versionName, e);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new ApplicationManagementDAOException("Error while getting release details of the application " +
|
||||||
|
applicationUuid + " and version " + versionName + " , while executing the query " + sql, e);
|
||||||
|
} finally {
|
||||||
|
Util.cleanupResources(statement, resultSet);
|
||||||
|
Util.cleanupResources(null, rsProperties);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ApplicationRelease> getApplicationReleases(String applicationUUID)
|
||||||
|
throws ApplicationManagementDAOException {
|
||||||
|
Connection connection;
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
ResultSet resultSet = null;
|
||||||
|
String sql = "SELECT * FROM APPM_APPLICATION_RELEASE WHERE APPM_APPLICATION_ID = (SELECT ID FROM "
|
||||||
|
+ "APPM_APPLICATION WHERE UUID = ?)";
|
||||||
|
List<ApplicationRelease> applicationReleases = new ArrayList<>();
|
||||||
|
ResultSet rsProperties = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
connection = this.getDBConnection();
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
statement.setString(1, applicationUUID);
|
||||||
|
resultSet = statement.executeQuery();
|
||||||
|
|
||||||
|
while (resultSet.next()) {
|
||||||
|
ApplicationRelease applicationRelease = new ApplicationRelease();
|
||||||
|
applicationRelease.setVersionName(resultSet.getString("VERSION_NAME"));
|
||||||
|
applicationRelease.setDefault(resultSet.getBoolean("IS_DEFAULT"));
|
||||||
|
applicationRelease.setCreatedAt(resultSet.getDate("CREATED_AT"));
|
||||||
|
applicationRelease.setReleaseChannel(resultSet.getString("RELEASE_CHANNEL"));
|
||||||
|
applicationRelease.setReleaseDetails(resultSet.getString("RELEASE_DETAILS"));
|
||||||
|
applicationRelease.setResource(resultSet.getString("RESOURCE"));
|
||||||
|
|
||||||
|
sql = "SELECT * FROM APPM_RELEASE_PROPERTY WHERE APPLICATION_RELEASE_ID= ?";
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
statement.setInt(1, resultSet.getInt("ID"));
|
||||||
|
rsProperties = statement.executeQuery();
|
||||||
|
|
||||||
|
Map<String, String> properties = new HashMap<>();
|
||||||
|
while (rsProperties.next()) {
|
||||||
|
properties.put(rsProperties.getString("PROP_KEY"), rsProperties.getString("PROP_VAL"));
|
||||||
|
}
|
||||||
|
applicationRelease.setProperties(properties);
|
||||||
|
applicationReleases.add(applicationRelease);
|
||||||
|
}
|
||||||
|
return applicationReleases;
|
||||||
|
} catch (DBConnectionException e) {
|
||||||
|
throw new ApplicationManagementDAOException("Database connection exception while trying to get the "
|
||||||
|
+ "release details of the application with UUID " + applicationUUID, e);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new ApplicationManagementDAOException(
|
||||||
|
"Error while getting all the release details of the " + "application " + applicationUUID
|
||||||
|
+ ", while executing the query " + sql, e);
|
||||||
|
} finally {
|
||||||
|
Util.cleanupResources(statement, resultSet);
|
||||||
|
Util.cleanupResources(null, rsProperties);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -33,6 +33,9 @@ import java.sql.SQLException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Concrete implementation for Lifecycle related DB operations.
|
||||||
|
*/
|
||||||
public class GenericLifecycleStateImpl extends AbstractDAOImpl implements LifecycleStateDAO {
|
public class GenericLifecycleStateImpl extends AbstractDAOImpl implements LifecycleStateDAO {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -82,7 +85,7 @@ public class GenericLifecycleStateImpl extends AbstractDAOImpl implements Lifecy
|
|||||||
String sql = "SELECT IDENTIFIER, NAME, DESCRIPTION FROM APPM_LIFECYCLE_STATE";
|
String sql = "SELECT IDENTIFIER, NAME, DESCRIPTION FROM APPM_LIFECYCLE_STATE";
|
||||||
stmt = conn.prepareStatement(sql);
|
stmt = conn.prepareStatement(sql);
|
||||||
rs = stmt.executeQuery();
|
rs = stmt.executeQuery();
|
||||||
while(rs.next()) {
|
while (rs.next()) {
|
||||||
LifecycleState lifecycleState = new LifecycleState();
|
LifecycleState lifecycleState = new LifecycleState();
|
||||||
lifecycleState.setIdentifier(rs.getString("IDENTIFIER"));
|
lifecycleState.setIdentifier(rs.getString("IDENTIFIER"));
|
||||||
lifecycleState.setName(rs.getString("NAME"));
|
lifecycleState.setName(rs.getString("NAME"));
|
||||||
|
|||||||
@ -20,6 +20,9 @@ package org.wso2.carbon.device.application.mgt.core.exception;
|
|||||||
|
|
||||||
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exception thrown during the Application Management DAO operations.
|
||||||
|
*/
|
||||||
public class ApplicationManagementDAOException extends ApplicationManagementException {
|
public class ApplicationManagementDAOException extends ApplicationManagementException {
|
||||||
|
|
||||||
public ApplicationManagementDAOException(String message, Throwable throwable) {
|
public ApplicationManagementDAOException(String message, Throwable throwable) {
|
||||||
|
|||||||
@ -17,6 +17,9 @@
|
|||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.application.mgt.core.exception;
|
package org.wso2.carbon.device.application.mgt.core.exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This exception will be thrown when there is an issue with Lifecycle related DAO operations.
|
||||||
|
*/
|
||||||
public class DAOException extends Exception {
|
public class DAOException extends Exception {
|
||||||
|
|
||||||
public DAOException(String message) {
|
public DAOException(String message) {
|
||||||
|
|||||||
@ -20,6 +20,9 @@ package org.wso2.carbon.device.application.mgt.core.exception;
|
|||||||
|
|
||||||
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This exception will be thrown when the requested application or platform not found.
|
||||||
|
*/
|
||||||
public class NotFoundException extends ApplicationManagementException {
|
public class NotFoundException extends ApplicationManagementException {
|
||||||
|
|
||||||
public NotFoundException(String message, Throwable throwable) {
|
public NotFoundException(String message, Throwable throwable) {
|
||||||
|
|||||||
@ -20,6 +20,9 @@ package org.wso2.carbon.device.application.mgt.core.exception;
|
|||||||
|
|
||||||
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This exception will be thrown when the initial validation fails to perform an operation.
|
||||||
|
*/
|
||||||
public class ValidationException extends ApplicationManagementException {
|
public class ValidationException extends ApplicationManagementException {
|
||||||
|
|
||||||
public ValidationException(String message, Throwable throwable) {
|
public ValidationException(String message, Throwable throwable) {
|
||||||
|
|||||||
@ -46,10 +46,14 @@ import org.wso2.carbon.user.api.UserRealm;
|
|||||||
import org.wso2.carbon.user.api.UserStoreException;
|
import org.wso2.carbon.user.api.UserStoreException;
|
||||||
import org.wso2.carbon.utils.multitenancy.MultitenantUtils;
|
import org.wso2.carbon.utils.multitenancy.MultitenantUtils;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default Concrete implementation of Application Management related implementations.
|
||||||
|
*/
|
||||||
public class ApplicationManagerImpl implements ApplicationManager {
|
public class ApplicationManagerImpl implements ApplicationManager {
|
||||||
|
|
||||||
private static final Log log = LogFactory.getLog(ApplicationManagerImpl.class);
|
private static final Log log = LogFactory.getLog(ApplicationManagerImpl.class);
|
||||||
@ -182,15 +186,15 @@ public class ApplicationManagerImpl implements ApplicationManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void changeLifecycle(String applicationUUID, String lifecycleIdentifier) throws
|
public void changeLifecycle(String applicationUuid, String lifecycleIdentifier) throws
|
||||||
ApplicationManagementException {
|
ApplicationManagementException {
|
||||||
boolean isAvailableNextState = false;
|
boolean isAvailableNextState = false;
|
||||||
String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
|
String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
|
||||||
List<LifecycleStateTransition> nextLifeCycles = getLifeCycleStates(applicationUUID);
|
List<LifecycleStateTransition> nextLifeCycles = getLifeCycleStates(applicationUuid);
|
||||||
|
|
||||||
for (LifecycleStateTransition lifecycleStateTransition : nextLifeCycles) {
|
for (LifecycleStateTransition lifecycleStateTransition : nextLifeCycles) {
|
||||||
if (log.isDebugEnabled()) {
|
if (log.isDebugEnabled()) {
|
||||||
log.debug("Lifecycle state of the application " + applicationUUID + " can be changed to"
|
log.debug("Lifecycle state of the application " + applicationUuid + " can be changed to"
|
||||||
+ lifecycleStateTransition.getNextState());
|
+ lifecycleStateTransition.getNextState());
|
||||||
}
|
}
|
||||||
if (lifecycleStateTransition.getNextState().equalsIgnoreCase(lifecycleIdentifier)) {
|
if (lifecycleStateTransition.getNextState().equalsIgnoreCase(lifecycleIdentifier)) {
|
||||||
@ -200,13 +204,13 @@ public class ApplicationManagerImpl implements ApplicationManager {
|
|||||||
}
|
}
|
||||||
if (!isAvailableNextState) {
|
if (!isAvailableNextState) {
|
||||||
throw new ApplicationManagementException("User " + userName + " does not have the permission to change "
|
throw new ApplicationManagementException("User " + userName + " does not have the permission to change "
|
||||||
+ "the lifecycle state of the application " + applicationUUID + " to lifecycle state "
|
+ "the lifecycle state of the application " + applicationUuid + " to lifecycle state "
|
||||||
+ lifecycleIdentifier);
|
+ lifecycleIdentifier);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
ConnectionManagerUtil.beginDBTransaction();
|
ConnectionManagerUtil.beginDBTransaction();
|
||||||
ApplicationDAO applicationDAO = DAOFactory.getApplicationDAO();
|
ApplicationDAO applicationDAO = DAOFactory.getApplicationDAO();
|
||||||
applicationDAO.changeLifecycle(applicationUUID, lifecycleIdentifier, userName);
|
applicationDAO.changeLifecycle(applicationUuid, lifecycleIdentifier, userName);
|
||||||
ConnectionManagerUtil.commitDBTransaction();
|
ConnectionManagerUtil.commitDBTransaction();
|
||||||
} catch (ApplicationManagementDAOException e) {
|
} catch (ApplicationManagementDAOException e) {
|
||||||
ConnectionManagerUtil.rollbackDBTransaction();
|
ConnectionManagerUtil.rollbackDBTransaction();
|
||||||
@ -282,6 +286,12 @@ public class ApplicationManagerImpl implements ApplicationManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void uploadArtifacts(String applicationUUID, InputStream iconFileStream, InputStream bannerFileStream,
|
||||||
|
List<InputStream> screenShotStreams)
|
||||||
|
throws ApplicationManagementException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To check whether current user is application owner or admin.
|
* To check whether current user is application owner or admin.
|
||||||
*
|
*
|
||||||
@ -297,7 +307,8 @@ public class ApplicationManagerImpl implements ApplicationManager {
|
|||||||
}
|
}
|
||||||
} catch (UserStoreException e) {
|
} catch (UserStoreException e) {
|
||||||
throw new ApplicationManagementException("Userstore exception while checking whether user is an admin", e);
|
throw new ApplicationManagementException("Userstore exception while checking whether user is an admin", e);
|
||||||
} try {
|
}
|
||||||
|
try {
|
||||||
ConnectionManagerUtil.openDBConnection();
|
ConnectionManagerUtil.openDBConnection();
|
||||||
Application application = DAOFactory.getApplicationDAO().getApplication(applicationUUID);
|
Application application = DAOFactory.getApplicationDAO().getApplication(applicationUUID);
|
||||||
return application.getUser().getUserName().equals(userName)
|
return application.getUser().getUserName().equals(userName)
|
||||||
|
|||||||
@ -18,8 +18,139 @@
|
|||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.application.mgt.core.impl;
|
package org.wso2.carbon.device.application.mgt.core.impl;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.Application;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.ApplicationRelease;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager;
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager;
|
||||||
|
import org.wso2.carbon.device.application.mgt.core.dao.common.DAOFactory;
|
||||||
|
import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException;
|
||||||
|
import org.wso2.carbon.device.application.mgt.core.internal.DataHolder;
|
||||||
|
import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Concrete implementation for Application Release Management related tasks.
|
||||||
|
*/
|
||||||
public class ApplicationReleaseManagerImpl implements ApplicationReleaseManager {
|
public class ApplicationReleaseManagerImpl implements ApplicationReleaseManager {
|
||||||
|
private static Log log = LogFactory.getLog(ApplicationReleaseManagerImpl.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ApplicationRelease createRelease(String appicationUuid, ApplicationRelease applicationRelease) throws
|
||||||
|
ApplicationManagementException {
|
||||||
|
Application application = validateReleaseCreateRequest(appicationUuid, applicationRelease);
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Application release request is received for the application " + application.toString());
|
||||||
|
}
|
||||||
|
applicationRelease.setCreatedAt(new Date());
|
||||||
|
try {
|
||||||
|
ConnectionManagerUtil.beginDBTransaction();
|
||||||
|
applicationRelease.setApplication(application);
|
||||||
|
applicationRelease = DAOFactory.getApplicationReleaseDAO().createRelease(applicationRelease);
|
||||||
|
ConnectionManagerUtil.commitDBTransaction();
|
||||||
|
return applicationRelease;
|
||||||
|
} catch (ApplicationManagementDAOException e) {
|
||||||
|
ConnectionManagerUtil.rollbackDBTransaction();
|
||||||
|
throw e;
|
||||||
|
} finally {
|
||||||
|
ConnectionManagerUtil.closeDBConnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ApplicationRelease getRelease(String applicationUuid, String version) throws
|
||||||
|
ApplicationManagementException {
|
||||||
|
Application application = validationGetReleaseRequest(applicationUuid);
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Application release retrieval request is received for the application " +
|
||||||
|
application.toString() + " and version " + version);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ConnectionManagerUtil.openDBConnection();
|
||||||
|
return DAOFactory.getApplicationReleaseDAO().getRelease(applicationUuid, version);
|
||||||
|
} finally {
|
||||||
|
ConnectionManagerUtil.closeDBConnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ApplicationRelease> getReleases(String applicationUuid) throws ApplicationManagementException {
|
||||||
|
Application application = validationGetReleaseRequest(applicationUuid);
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Request is received to retrieve all the releases related with the application " +
|
||||||
|
application.toString());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ConnectionManagerUtil.openDBConnection();
|
||||||
|
return DAOFactory.getApplicationReleaseDAO().getApplicationReleases(applicationUuid);
|
||||||
|
} finally {
|
||||||
|
ConnectionManagerUtil.closeDBConnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void makeDefaultRelease(int id) throws ApplicationManagementException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateRelease(ApplicationRelease applicationRelease) throws ApplicationManagementException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To validate the pre-request of the ApplicationRelease.
|
||||||
|
*
|
||||||
|
* @param applicationUuid UUID of the Application.
|
||||||
|
* @return Application related with the UUID
|
||||||
|
*/
|
||||||
|
private Application validationGetReleaseRequest(String applicationUuid) throws ApplicationManagementException {
|
||||||
|
if (applicationUuid == null) {
|
||||||
|
throw new ApplicationManagementException("Application UUID is null. Application UUID is a required "
|
||||||
|
+ "parameter to get the releases related to a particular application.");
|
||||||
|
}
|
||||||
|
Application application = DataHolder.getInstance().getApplicationManager().getApplication(applicationUuid);
|
||||||
|
if (application == null) {
|
||||||
|
throw new ApplicationManagementException(
|
||||||
|
"Application with UUID " + applicationUuid + " does not exist. Cannot "
|
||||||
|
+ "retrieve the releases for a non-existing application.");
|
||||||
|
}
|
||||||
|
return application;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To validate a create release request to make sure all the pre-conditions satisfied.
|
||||||
|
*
|
||||||
|
* @param applicationUuid UUID of the Application.
|
||||||
|
* @param applicationRelease ApplicationRelease that need to be created.
|
||||||
|
* @return the Application related with the particular Application Release
|
||||||
|
* @throws ApplicationManagementException Application Management Exception.
|
||||||
|
*/
|
||||||
|
private Application validateReleaseCreateRequest(String applicationUuid, ApplicationRelease applicationRelease)
|
||||||
|
throws ApplicationManagementException {
|
||||||
|
if (applicationUuid == null) {
|
||||||
|
throw new ApplicationManagementException("Application UUID is null. Application UUID is a required "
|
||||||
|
+ "parameter to do the application release");
|
||||||
|
}
|
||||||
|
Application application = DataHolder.getInstance().getApplicationManager().getApplication(applicationUuid);
|
||||||
|
if (application == null) {
|
||||||
|
throw new ApplicationManagementException(
|
||||||
|
"Application with UUID " + applicationUuid + " does not exist. Cannot "
|
||||||
|
+ "release an application that is not existing");
|
||||||
|
}
|
||||||
|
if (applicationRelease == null || applicationRelease.getVersionName() == null) {
|
||||||
|
throw new ApplicationManagementException("ApplicationRelease version name is a mandatory parameter for "
|
||||||
|
+ "creating release. It cannot be found.");
|
||||||
|
}
|
||||||
|
if (getRelease(applicationUuid, applicationRelease.getVersionName()) != null) {
|
||||||
|
throw new ApplicationManagementException(
|
||||||
|
"Application Release for the Application UUID " + applicationUuid + " " + "with the version "
|
||||||
|
+ applicationRelease.getVersionName() + " already exists. Cannot create an "
|
||||||
|
+ "application release with the same version.");
|
||||||
|
}
|
||||||
|
return application;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,219 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
* Version 2.0 (the "License"); you may not use this file except
|
||||||
|
* in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.wso2.carbon.device.application.mgt.core.impl;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.Application;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationStorageManagementException;
|
||||||
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager;
|
||||||
|
import org.wso2.carbon.device.application.mgt.core.internal.DataHolder;
|
||||||
|
import org.wso2.carbon.device.application.mgt.core.util.Constants;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class contains the default concrete implementation of ApplicationStorage Management.
|
||||||
|
*/
|
||||||
|
public class ApplicationStorageManagerImpl implements ApplicationStorageManager {
|
||||||
|
private static final Log log = LogFactory.getLog(ApplicationStorageManagerImpl.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void uploadImageArtifacts(String applicationUUID, InputStream iconFileStream, InputStream bannerFileStream,
|
||||||
|
List<InputStream> screenShotStreams) throws ApplicationStorageManagementException {
|
||||||
|
Application application;
|
||||||
|
try {
|
||||||
|
application = DataHolder.getInstance().getApplicationManager().getApplication(applicationUUID);
|
||||||
|
} catch (ApplicationManagementException e) {
|
||||||
|
throw new ApplicationStorageManagementException(
|
||||||
|
"Exception while retrieving the application details for " + "the application with UUID "
|
||||||
|
+ applicationUUID);
|
||||||
|
}
|
||||||
|
if (application == null) {
|
||||||
|
throw new ApplicationStorageManagementException("Application with UUID " + applicationUUID + " does not "
|
||||||
|
+ "exist. Cannot upload the artifacts to non-existing application.");
|
||||||
|
}
|
||||||
|
String artifactDirectoryPath = Constants.artifactPath + application.getId();
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Artifact Directory Path for saving the artifacts related with application " + applicationUUID
|
||||||
|
+ " is " + artifactDirectoryPath);
|
||||||
|
}
|
||||||
|
createArtifactDirectory(artifactDirectoryPath);
|
||||||
|
if (iconFileStream != null) {
|
||||||
|
String iconName = application.getIconName();
|
||||||
|
iconName = (iconName == null) ? "icon" : iconName;
|
||||||
|
try {
|
||||||
|
saveFile(iconFileStream, artifactDirectoryPath + File.separator + iconName);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new ApplicationStorageManagementException(
|
||||||
|
"IO Exception while saving the icon file in the server for " + "the application "
|
||||||
|
+ applicationUUID, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bannerFileStream != null) {
|
||||||
|
String bannerName = application.getBannerName();
|
||||||
|
bannerName = (bannerName == null) ? "banner" : bannerName;
|
||||||
|
try {
|
||||||
|
saveFile(bannerFileStream, artifactDirectoryPath + File.separator + bannerName);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new ApplicationStorageManagementException(
|
||||||
|
"IO Exception while saving the banner file in the server for" + " the application "
|
||||||
|
+ applicationUUID, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (screenShotStreams != null) {
|
||||||
|
int count = 1;
|
||||||
|
String screenshotName;
|
||||||
|
List<String> screenShotNames = application.getScreenshots();
|
||||||
|
boolean isScreenShotNameExist = (screenShotNames == null || screenShotNames.isEmpty());
|
||||||
|
int screenShotNameLength = isScreenShotNameExist ? screenShotNames.size() : 0;
|
||||||
|
for (InputStream screenshotStream : screenShotStreams) {
|
||||||
|
try {
|
||||||
|
if (isScreenShotNameExist && count <= screenShotNameLength) {
|
||||||
|
screenshotName = screenShotNames.get(count);
|
||||||
|
} else {
|
||||||
|
screenshotName = "screenshot_" + count;
|
||||||
|
}
|
||||||
|
saveFile(screenshotStream, artifactDirectoryPath + File.separator + screenshotName);
|
||||||
|
count++;
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new ApplicationStorageManagementException(
|
||||||
|
"IO Exception while saving the screens hots for the " + "application " + applicationUUID,
|
||||||
|
e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void uploadReleaseArtifacts(String applicationUUID, String versionName, InputStream binaryFile)
|
||||||
|
throws ApplicationStorageManagementException {
|
||||||
|
Application application;
|
||||||
|
try {
|
||||||
|
application = DataHolder.getInstance().getApplicationManager().getApplication(applicationUUID);
|
||||||
|
} catch (ApplicationManagementException e) {
|
||||||
|
throw new ApplicationStorageManagementException("Exception while retrieving the application details for "
|
||||||
|
+ "the application with UUID " + applicationUUID);
|
||||||
|
}
|
||||||
|
if (application == null) {
|
||||||
|
throw new ApplicationStorageManagementException("Application with UUID " + applicationUUID + " does not "
|
||||||
|
+ "exist. Cannot upload release artifacts for not existing application.");
|
||||||
|
}
|
||||||
|
String artifactDirectoryPath = Constants.artifactPath + application.getId();
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Artifact Directory Path for saving the application release related artifacts related with "
|
||||||
|
+ "application " + applicationUUID + " is " + artifactDirectoryPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
createArtifactDirectory(artifactDirectoryPath);
|
||||||
|
if (binaryFile != null) {
|
||||||
|
try {
|
||||||
|
saveFile(binaryFile, artifactDirectoryPath + File.separator + versionName);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new ApplicationStorageManagementException(
|
||||||
|
"IO Exception while saving the release artifacts in the server for the application "
|
||||||
|
+ applicationUUID, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InputStream getReleasedArtifacts(String applicationUUID, String versionName)
|
||||||
|
throws ApplicationStorageManagementException {
|
||||||
|
Application application;
|
||||||
|
try {
|
||||||
|
application = DataHolder.getInstance().getApplicationManager().getApplication(applicationUUID);
|
||||||
|
} catch (ApplicationManagementException e) {
|
||||||
|
throw new ApplicationStorageManagementException("Exception while retrieving the application details for "
|
||||||
|
+ "the application with UUID " + applicationUUID);
|
||||||
|
}
|
||||||
|
if (application == null) {
|
||||||
|
throw new ApplicationStorageManagementException("Application with UUID " + applicationUUID + " does not "
|
||||||
|
+ "exist. Cannot retrieve release artifacts for not existing application.");
|
||||||
|
}
|
||||||
|
String artifactPath = Constants.artifactPath + application.getId() + File.separator + versionName;
|
||||||
|
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("ApplicationRelease artifacts are searched in the location " + artifactPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
File binaryFile = new File(artifactPath);
|
||||||
|
|
||||||
|
if (!binaryFile.exists()) {
|
||||||
|
throw new ApplicationStorageManagementException("Binary file does not exist for this release");
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
return new FileInputStream(artifactPath);
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
throw new ApplicationStorageManagementException("Binary file does not exist for the version " +
|
||||||
|
versionName + " for the application ", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To save a file in a given location.
|
||||||
|
*
|
||||||
|
* @param inputStream Stream of the file.
|
||||||
|
* @param path Path the file need to be saved in.
|
||||||
|
*/
|
||||||
|
private void saveFile(InputStream inputStream, String path) throws IOException {
|
||||||
|
OutputStream outStream = null;
|
||||||
|
try {
|
||||||
|
byte[] buffer = new byte[inputStream.available()];
|
||||||
|
inputStream.read(buffer);
|
||||||
|
outStream = new FileOutputStream(new File(path));
|
||||||
|
outStream.write(buffer);
|
||||||
|
} finally {
|
||||||
|
if (inputStream != null) {
|
||||||
|
inputStream.close();
|
||||||
|
}
|
||||||
|
if (outStream != null) {
|
||||||
|
outStream.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is responsible for creating artifact parent directories in the given path.
|
||||||
|
*
|
||||||
|
* @param artifactDirectoryPath Path for the artifact directory.
|
||||||
|
* @throws ApplicationStorageManagementException Application Storage Management Exception.
|
||||||
|
*/
|
||||||
|
private void createArtifactDirectory(String artifactDirectoryPath) throws ApplicationStorageManagementException {
|
||||||
|
File artifactDirectory = new File(artifactDirectoryPath);
|
||||||
|
|
||||||
|
if (!artifactDirectory.exists()) {
|
||||||
|
if (!artifactDirectory.mkdirs()) {
|
||||||
|
throw new ApplicationStorageManagementException(
|
||||||
|
"Cannot create directories in the path to save the application related artifacts");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,29 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
|
||||||
*
|
|
||||||
* WSO2 Inc. licenses this file to you under the Apache License,
|
|
||||||
* Version 2.0 (the "License"); you may not use this file except
|
|
||||||
* in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing,
|
|
||||||
* software distributed under the License is distributed on an
|
|
||||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
* KIND, either express or implied. See the License for the
|
|
||||||
* specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.wso2.carbon.device.application.mgt.core.impl;
|
|
||||||
|
|
||||||
|
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.ApplicationUploadManager;
|
|
||||||
|
|
||||||
public class ApplicationUploadManagerImpl implements ApplicationUploadManager {
|
|
||||||
|
|
||||||
public ApplicationUploadManagerImpl(String uploadPath){
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -30,6 +30,9 @@ import org.wso2.carbon.device.application.mgt.core.util.ConnectionManagerUtil;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Concrete implementation of Lifecycle state management.
|
||||||
|
*/
|
||||||
public class LifecycleStateManagerImpl implements LifecycleStateManager {
|
public class LifecycleStateManagerImpl implements LifecycleStateManager {
|
||||||
|
|
||||||
private static final Log log = LogFactory.getLog(LifecycleStateManagerImpl.class);
|
private static final Log log = LogFactory.getLog(LifecycleStateManagerImpl.class);
|
||||||
|
|||||||
@ -89,16 +89,11 @@ public class PlatformManagerImpl implements PlatformManager {
|
|||||||
+ "PlatformManager level");
|
+ "PlatformManager level");
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
ConnectionManagerUtil.beginDBTransaction();
|
ConnectionManagerUtil.openDBConnection();
|
||||||
platforms = DAOFactory.getPlatformDAO().getPlatforms(tenantId);
|
platforms = DAOFactory.getPlatformDAO().getPlatforms(tenantId);
|
||||||
ConnectionManagerUtil.commitDBTransaction();
|
} catch (DBConnectionException e) {
|
||||||
} catch (DBConnectionException | TransactionManagementException e) {
|
|
||||||
ConnectionManagerUtil.rollbackDBTransaction();
|
|
||||||
throw new PlatformManagementDAOException(
|
throw new PlatformManagementDAOException(
|
||||||
"Database Connection Exception while getting the platforms for the tenant : " + tenantId, e);
|
"Database Connection Exception while getting the platforms for the tenant : " + tenantId, e);
|
||||||
} catch (PlatformManagementDAOException e) {
|
|
||||||
ConnectionManagerUtil.rollbackDBTransaction();
|
|
||||||
throw e;
|
|
||||||
} finally {
|
} finally {
|
||||||
ConnectionManagerUtil.closeDBConnection();
|
ConnectionManagerUtil.closeDBConnection();
|
||||||
}
|
}
|
||||||
@ -136,20 +131,15 @@ public class PlatformManagerImpl implements PlatformManager {
|
|||||||
Platform platform = getPlatformFromInMemory(tenantId, identifier);
|
Platform platform = getPlatformFromInMemory(tenantId, identifier);
|
||||||
if (platform == null) {
|
if (platform == null) {
|
||||||
try {
|
try {
|
||||||
ConnectionManagerUtil.beginDBTransaction();
|
ConnectionManagerUtil.openDBConnection();
|
||||||
platform = DAOFactory.getPlatformDAO().getPlatform(tenantId, identifier);
|
platform = DAOFactory.getPlatformDAO().getPlatform(tenantId, identifier);
|
||||||
ConnectionManagerUtil.commitDBTransaction();
|
|
||||||
if (platform != null) {
|
if (platform != null) {
|
||||||
return platform;
|
return platform;
|
||||||
}
|
}
|
||||||
} catch (DBConnectionException | TransactionManagementException e) {
|
} catch (DBConnectionException e) {
|
||||||
ConnectionManagerUtil.rollbackDBTransaction();
|
|
||||||
throw new PlatformManagementDAOException(
|
throw new PlatformManagementDAOException(
|
||||||
"Database Connection Exception while trying to get the " + "platform with the id :" + identifier
|
"Database Connection Exception while trying to get the " + "platform with the id :" + identifier
|
||||||
+ " for the tenant : " + tenantId, e);
|
+ " for the tenant : " + tenantId, e);
|
||||||
} catch (PlatformManagementDAOException e) {
|
|
||||||
ConnectionManagerUtil.rollbackDBTransaction();
|
|
||||||
throw e;
|
|
||||||
} finally {
|
} finally {
|
||||||
ConnectionManagerUtil.closeDBConnection();
|
ConnectionManagerUtil.closeDBConnection();
|
||||||
}
|
}
|
||||||
@ -455,18 +445,16 @@ public class PlatformManagerImpl implements PlatformManager {
|
|||||||
private void validateBeforeRegister(int tenantId, Platform platform) throws PlatformManagementException {
|
private void validateBeforeRegister(int tenantId, Platform platform) throws PlatformManagementException {
|
||||||
validatePlatformSharing(tenantId, platform);
|
validatePlatformSharing(tenantId, platform);
|
||||||
try {
|
try {
|
||||||
ConnectionManagerUtil.beginDBTransaction();
|
ConnectionManagerUtil.openDBConnection();
|
||||||
int existingPlatformId = DAOFactory.getPlatformDAO()
|
int existingPlatformId = DAOFactory.getPlatformDAO()
|
||||||
.getSuperTenantAndOwnPlatforms(platform.getIdentifier(), tenantId);
|
.getSuperTenantAndOwnPlatforms(platform.getIdentifier(), tenantId);
|
||||||
ConnectionManagerUtil.commitDBTransaction();
|
|
||||||
if (existingPlatformId != -1) {
|
if (existingPlatformId != -1) {
|
||||||
throw new PlatformManagementException(
|
throw new PlatformManagementException(
|
||||||
"Another platform exists with the identifier " + platform.getIdentifier() + " in the tenant "
|
"Another platform exists with the identifier " + platform.getIdentifier() + " in the tenant "
|
||||||
+ tenantId + " or super-tenant. Please choose a "
|
+ tenantId + " or super-tenant. Please choose a "
|
||||||
+ "different identifier for your platform");
|
+ "different identifier for your platform");
|
||||||
}
|
}
|
||||||
} catch (TransactionManagementException | DBConnectionException e) {
|
} catch (DBConnectionException e) {
|
||||||
ConnectionManagerUtil.rollbackDBTransaction();
|
|
||||||
throw new PlatformManagementException(
|
throw new PlatformManagementException(
|
||||||
"Error while checking pre-conditions before registering" + " platform identifier '" + platform
|
"Error while checking pre-conditions before registering" + " platform identifier '" + platform
|
||||||
.getIdentifier() + "' for the tenant :" + tenantId);
|
.getIdentifier() + "' for the tenant :" + tenantId);
|
||||||
@ -488,10 +476,9 @@ public class PlatformManagerImpl implements PlatformManager {
|
|||||||
PlatformManagementException {
|
PlatformManagementException {
|
||||||
validatePlatformSharing(tenantId, platform);
|
validatePlatformSharing(tenantId, platform);
|
||||||
try {
|
try {
|
||||||
ConnectionManagerUtil.beginDBTransaction();
|
ConnectionManagerUtil.openDBConnection();
|
||||||
Platform oldPlatform = DAOFactory.getPlatformDAO().getTenantOwnedPlatform(tenantId, oldPlatformIdentifier);
|
Platform oldPlatform = DAOFactory.getPlatformDAO().getTenantOwnedPlatform(tenantId, oldPlatformIdentifier);
|
||||||
if (oldPlatform == null) {
|
if (oldPlatform == null) {
|
||||||
ConnectionManagerUtil.commitDBTransaction();
|
|
||||||
throw new PlatformManagementException(
|
throw new PlatformManagementException(
|
||||||
"Cannot update platform. Platform with identifier : " + oldPlatformIdentifier
|
"Cannot update platform. Platform with identifier : " + oldPlatformIdentifier
|
||||||
+ " does not exist for the tenant : " + tenantId);
|
+ " does not exist for the tenant : " + tenantId);
|
||||||
@ -499,7 +486,6 @@ public class PlatformManagerImpl implements PlatformManager {
|
|||||||
if (platform.getIdentifier() != null && !platform.getIdentifier().equals(oldPlatformIdentifier)) {
|
if (platform.getIdentifier() != null && !platform.getIdentifier().equals(oldPlatformIdentifier)) {
|
||||||
int existingPlatformID = DAOFactory.getPlatformDAO()
|
int existingPlatformID = DAOFactory.getPlatformDAO()
|
||||||
.getSuperTenantAndOwnPlatforms(platform.getIdentifier(), tenantId);
|
.getSuperTenantAndOwnPlatforms(platform.getIdentifier(), tenantId);
|
||||||
ConnectionManagerUtil.commitDBTransaction();
|
|
||||||
if (existingPlatformID == -1) {
|
if (existingPlatformID == -1) {
|
||||||
throw new PlatformManagementException(
|
throw new PlatformManagementException(
|
||||||
"Cannot update the identifier of the platform from '" + oldPlatformIdentifier + "' to '"
|
"Cannot update the identifier of the platform from '" + oldPlatformIdentifier + "' to '"
|
||||||
@ -509,8 +495,7 @@ public class PlatformManagerImpl implements PlatformManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return oldPlatform;
|
return oldPlatform;
|
||||||
} catch (TransactionManagementException | DBConnectionException e) {
|
} catch (DBConnectionException e) {
|
||||||
ConnectionManagerUtil.rollbackDBTransaction();
|
|
||||||
throw new PlatformManagementException(
|
throw new PlatformManagementException(
|
||||||
"Database error while validating the platform update with the " + "platform identifier: "
|
"Database error while validating the platform update with the " + "platform identifier: "
|
||||||
+ oldPlatformIdentifier + " for the tenant :" + tenantId);
|
+ oldPlatformIdentifier + " for the tenant :" + tenantId);
|
||||||
@ -532,18 +517,16 @@ public class PlatformManagerImpl implements PlatformManager {
|
|||||||
+ " cannot be shared by the tenant domain - " + tenantId);
|
+ " cannot be shared by the tenant domain - " + tenantId);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
ConnectionManagerUtil.beginDBTransaction();
|
ConnectionManagerUtil.openDBConnection();
|
||||||
if (platform.isShared()) {
|
if (platform.isShared()) {
|
||||||
int sharedPlatform = DAOFactory.getPlatformDAO().getMultiTenantPlatforms(platform.getIdentifier());
|
int sharedPlatform = DAOFactory.getPlatformDAO().getMultiTenantPlatforms(platform.getIdentifier());
|
||||||
ConnectionManagerUtil.commitDBTransaction();
|
|
||||||
if (sharedPlatform != -1) {
|
if (sharedPlatform != -1) {
|
||||||
throw new PlatformManagementException(
|
throw new PlatformManagementException(
|
||||||
"Platform '" + platform.getIdentifier() + "' cannot be shared as some other tenants have "
|
"Platform '" + platform.getIdentifier() + "' cannot be shared as some other tenants have "
|
||||||
+ "platforms with the same identifier.");
|
+ "platforms with the same identifier.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (TransactionManagementException | DBConnectionException e) {
|
} catch (DBConnectionException e) {
|
||||||
ConnectionManagerUtil.rollbackDBTransaction();
|
|
||||||
throw new PlatformManagementException(
|
throw new PlatformManagementException(
|
||||||
"Error while checking platform sharing conditions for " + " platform identifier '" + platform
|
"Error while checking platform sharing conditions for " + " platform identifier '" + platform
|
||||||
.getIdentifier() + "' for the tenant :" + tenantId);
|
.getIdentifier() + "' for the tenant :" + tenantId);
|
||||||
|
|||||||
@ -20,7 +20,7 @@ package org.wso2.carbon.device.application.mgt.core.internal;
|
|||||||
|
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager;
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.ApplicationUploadManager;
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.CategoryManager;
|
import org.wso2.carbon.device.application.mgt.common.services.CategoryManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.CommentsManager;
|
import org.wso2.carbon.device.application.mgt.common.services.CommentsManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager;
|
import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager;
|
||||||
@ -58,7 +58,7 @@ public class DataHolder {
|
|||||||
|
|
||||||
private VisibilityManager visibilityManager;
|
private VisibilityManager visibilityManager;
|
||||||
|
|
||||||
private ApplicationUploadManager applicationUploadManager;
|
private ApplicationStorageManager applicationStorageManager;
|
||||||
|
|
||||||
private static final DataHolder applicationMgtDataHolder = new DataHolder();
|
private static final DataHolder applicationMgtDataHolder = new DataHolder();
|
||||||
|
|
||||||
@ -150,14 +150,6 @@ public class DataHolder {
|
|||||||
this.visibilityManager = visibilityManager;
|
this.visibilityManager = visibilityManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setApplicationUploadManager(ApplicationUploadManager applicationUploadManager) {
|
|
||||||
this.applicationUploadManager = applicationUploadManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ApplicationUploadManager getApplicationUploadManager() {
|
|
||||||
return applicationUploadManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RealmService getRealmService() {
|
public RealmService getRealmService() {
|
||||||
return realmService;
|
return realmService;
|
||||||
}
|
}
|
||||||
@ -166,4 +158,11 @@ public class DataHolder {
|
|||||||
this.realmService = realmService;
|
this.realmService = realmService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setApplicationStorageManager(ApplicationStorageManager applicationStorageManager) {
|
||||||
|
this.applicationStorageManager = applicationStorageManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApplicationStorageManager getApplicationStorageManager() {
|
||||||
|
return applicationStorageManager;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,7 +25,7 @@ import org.osgi.service.component.ComponentContext;
|
|||||||
import org.wso2.carbon.device.application.mgt.common.exception.InvalidConfigurationException;
|
import org.wso2.carbon.device.application.mgt.common.exception.InvalidConfigurationException;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager;
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.ApplicationUploadManager;
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.CategoryManager;
|
import org.wso2.carbon.device.application.mgt.common.services.CategoryManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.CommentsManager;
|
import org.wso2.carbon.device.application.mgt.common.services.CommentsManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager;
|
import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager;
|
||||||
@ -37,6 +37,7 @@ import org.wso2.carbon.device.application.mgt.core.config.ConfigurationManager;
|
|||||||
import org.wso2.carbon.device.application.mgt.core.dao.common.DAOFactory;
|
import org.wso2.carbon.device.application.mgt.core.dao.common.DAOFactory;
|
||||||
import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException;
|
import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException;
|
||||||
import org.wso2.carbon.device.application.mgt.core.util.ApplicationManagementUtil;
|
import org.wso2.carbon.device.application.mgt.core.util.ApplicationManagementUtil;
|
||||||
|
import org.wso2.carbon.device.application.mgt.core.util.Constants;
|
||||||
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
|
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
|
||||||
import org.wso2.carbon.ndatasource.core.DataSourceService;
|
import org.wso2.carbon.ndatasource.core.DataSourceService;
|
||||||
import org.wso2.carbon.user.core.service.RealmService;
|
import org.wso2.carbon.user.core.service.RealmService;
|
||||||
@ -77,6 +78,8 @@ public class ServiceComponent {
|
|||||||
String datasourceName = ConfigurationManager.getInstance().getConfiguration().getDatasourceName();
|
String datasourceName = ConfigurationManager.getInstance().getConfiguration().getDatasourceName();
|
||||||
DAOFactory.init(datasourceName);
|
DAOFactory.init(datasourceName);
|
||||||
|
|
||||||
|
Constants.artifactPath = ConfigurationManager.getInstance().getConfiguration().getArtifacts()
|
||||||
|
.getBinaryLocation();
|
||||||
ApplicationManager applicationManager = ApplicationManagementUtil.getApplicationManagerInstance();
|
ApplicationManager applicationManager = ApplicationManagementUtil.getApplicationManagerInstance();
|
||||||
DataHolder.getInstance().setApplicationManager(applicationManager);
|
DataHolder.getInstance().setApplicationManager(applicationManager);
|
||||||
bundleContext.registerService(ApplicationManager.class.getName(), applicationManager, null);
|
bundleContext.registerService(ApplicationManager.class.getName(), applicationManager, null);
|
||||||
@ -114,9 +117,10 @@ public class ServiceComponent {
|
|||||||
DataHolder.getInstance().setVisibilityTypeManager(visibilityTypeManager);
|
DataHolder.getInstance().setVisibilityTypeManager(visibilityTypeManager);
|
||||||
bundleContext.registerService(VisibilityTypeManager.class.getName(), visibilityTypeManager, null);
|
bundleContext.registerService(VisibilityTypeManager.class.getName(), visibilityTypeManager, null);
|
||||||
|
|
||||||
ApplicationUploadManager uploadManager = ApplicationManagementUtil.getApplicationUploadManagerInstance();
|
ApplicationStorageManager applicationStorageManager = ApplicationManagementUtil
|
||||||
DataHolder.getInstance().setApplicationUploadManager(uploadManager);
|
.getApplicationStorageManagerInstance();
|
||||||
bundleContext.registerService(ApplicationUploadManager.class.getName(), uploadManager, null);
|
DataHolder.getInstance().setApplicationStorageManager(applicationStorageManager);
|
||||||
|
bundleContext.registerService(ApplicationStorageManager.class.getName(), applicationStorageManager, null);
|
||||||
|
|
||||||
bundleContext.registerService(Axis2ConfigurationContextObserver.class.getName(),
|
bundleContext.registerService(Axis2ConfigurationContextObserver.class.getName(),
|
||||||
new PlatformManagementAxis2ConfigurationObserverImpl(), null);
|
new PlatformManagementAxis2ConfigurationObserverImpl(), null);
|
||||||
|
|||||||
@ -23,7 +23,7 @@ import org.apache.commons.logging.LogFactory;
|
|||||||
import org.wso2.carbon.device.application.mgt.common.exception.InvalidConfigurationException;
|
import org.wso2.carbon.device.application.mgt.common.exception.InvalidConfigurationException;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager;
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationReleaseManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.ApplicationUploadManager;
|
import org.wso2.carbon.device.application.mgt.common.services.ApplicationStorageManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.CategoryManager;
|
import org.wso2.carbon.device.application.mgt.common.services.CategoryManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.CommentsManager;
|
import org.wso2.carbon.device.application.mgt.common.services.CommentsManager;
|
||||||
import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager;
|
import org.wso2.carbon.device.application.mgt.common.services.LifecycleStateManager;
|
||||||
@ -99,10 +99,11 @@ public class ApplicationManagementUtil {
|
|||||||
return getInstance(extension, SubscriptionManager.class);
|
return getInstance(extension, SubscriptionManager.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ApplicationUploadManager getApplicationUploadManagerInstance() throws InvalidConfigurationException {
|
public static ApplicationStorageManager getApplicationStorageManagerInstance() throws
|
||||||
|
InvalidConfigurationException {
|
||||||
ConfigurationManager configurationManager = ConfigurationManager.getInstance();
|
ConfigurationManager configurationManager = ConfigurationManager.getInstance();
|
||||||
Extension extension = configurationManager.getExtension(Extension.Name.ApplicationUploadManager);
|
Extension extension = configurationManager.getExtension(Extension.Name.ApplicationStorageManager);
|
||||||
return getInstance(extension, ApplicationUploadManager.class);
|
return getInstance(extension, ApplicationStorageManager.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <T> T getInstance(Extension extension, Class<T> cls) throws InvalidConfigurationException {
|
private static <T> T getInstance(Extension extension, Class<T> cls) throws InvalidConfigurationException {
|
||||||
|
|||||||
@ -53,4 +53,9 @@ public class Constants {
|
|||||||
*/
|
*/
|
||||||
public static final String[] LIFE_CYCLES = {"CREATED", "IN REVIEW", "APPROVED", "REJECTED", "PUBLISHED",
|
public static final String[] LIFE_CYCLES = {"CREATED", "IN REVIEW", "APPROVED", "REJECTED", "PUBLISHED",
|
||||||
"UNPUBLISHED", "RETIRED"};
|
"UNPUBLISHED", "RETIRED"};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Path to save the Application related artifacts.
|
||||||
|
*/
|
||||||
|
public static String artifactPath = "";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -55,6 +55,13 @@
|
|||||||
<Extension name="VisibilityTypeManager">
|
<Extension name="VisibilityTypeManager">
|
||||||
<ClassName>org.wso2.carbon.device.application.mgt.core.impl.VisibilityTypeManagerImpl</ClassName>
|
<ClassName>org.wso2.carbon.device.application.mgt.core.impl.VisibilityTypeManagerImpl</ClassName>
|
||||||
</Extension>
|
</Extension>
|
||||||
|
<Extension name="ApplicationStorageManager">
|
||||||
|
<ClassName>org.wso2.carbon.device.application.mgt.core.impl.ApplicationStorageManagerImpl</ClassName>
|
||||||
|
</Extension>
|
||||||
</Extensions>
|
</Extensions>
|
||||||
|
|
||||||
|
<Artifacts>
|
||||||
|
<ImageLocation>${carbon.home}/repository/resources/mobileapps/images/</ImageLocation>
|
||||||
|
<BinaryLocation>${carbon.home}/repository/resources/mobileapps/binary/</BinaryLocation>
|
||||||
|
</Artifacts>
|
||||||
</ApplicationManagementConfiguration>
|
</ApplicationManagementConfiguration>
|
||||||
@ -181,15 +181,14 @@ CREATE INDEX FK_APPLICATION_PROPERTY_APPLICATION ON APPM_APPLICATION_PROPERTY(AP
|
|||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
CREATE TABLE IF NOT EXISTS APPM_APPLICATION_RELEASE (
|
CREATE TABLE IF NOT EXISTS APPM_APPLICATION_RELEASE (
|
||||||
ID INT NOT NULL AUTO_INCREMENT,
|
ID INT NOT NULL AUTO_INCREMENT,
|
||||||
VERSION_ID INT NOT NULL,
|
|
||||||
VERSION_NAME VARCHAR(100) NOT NULL,
|
VERSION_NAME VARCHAR(100) NOT NULL,
|
||||||
RESOURCE TEXT NULL,
|
RESOURCE TEXT NULL,
|
||||||
RELEASE_CHANNEL VARCHAR(50) NULL,
|
RELEASE_CHANNEL VARCHAR(50) NULL,
|
||||||
RELEASE_DETAILS TEXT NULL,
|
RELEASE_DETAILS TEXT NULL,
|
||||||
CREATED_AT DATETIME NOT NULL,
|
CREATED_AT DATETIME NOT NULL,
|
||||||
APPM_APPLICATION_ID INT NOT NULL,
|
APPM_APPLICATION_ID INT NOT NULL,
|
||||||
PUBLISHED TINYINT NULL,
|
IS_DEFAULT TINYINT NULL,
|
||||||
PRIMARY KEY (ID, APPM_APPLICATION_ID),
|
PRIMARY KEY (APPM_APPLICATION_ID, VERSION_NAME),
|
||||||
CONSTRAINT FK_APPLICATION_VERSION_APPLICATION
|
CONSTRAINT FK_APPLICATION_VERSION_APPLICATION
|
||||||
FOREIGN KEY (APPM_APPLICATION_ID)
|
FOREIGN KEY (APPM_APPLICATION_ID)
|
||||||
REFERENCES APPM_APPLICATION (ID)
|
REFERENCES APPM_APPLICATION (ID)
|
||||||
|
|||||||
@ -189,7 +189,6 @@ CREATE TABLE IF NOT EXISTS `APPM_APPLICATION_PROPERTY` (
|
|||||||
-- -----------------------------------------------------
|
-- -----------------------------------------------------
|
||||||
CREATE TABLE IF NOT EXISTS `APPM_APPLICATION_RELEASE` (
|
CREATE TABLE IF NOT EXISTS `APPM_APPLICATION_RELEASE` (
|
||||||
`ID` INT NOT NULL AUTO_INCREMENT,
|
`ID` INT NOT NULL AUTO_INCREMENT,
|
||||||
`VERSION_ID` INT NOT NULL,
|
|
||||||
`VERSION_NAME` VARCHAR(100) NOT NULL,
|
`VERSION_NAME` VARCHAR(100) NOT NULL,
|
||||||
`RESOURCE` TEXT NULL,
|
`RESOURCE` TEXT NULL,
|
||||||
`RELEASE_CHANNEL` VARCHAR(50) NULL,
|
`RELEASE_CHANNEL` VARCHAR(50) NULL,
|
||||||
@ -197,7 +196,7 @@ CREATE TABLE IF NOT EXISTS `APPM_APPLICATION_RELEASE` (
|
|||||||
`CREATED_AT` DATETIME NOT NULL,
|
`CREATED_AT` DATETIME NOT NULL,
|
||||||
`APPM_APPLICATION_ID` INT NOT NULL,
|
`APPM_APPLICATION_ID` INT NOT NULL,
|
||||||
`IS_DEFAULT` TINYINT(1) NULL,
|
`IS_DEFAULT` TINYINT(1) NULL,
|
||||||
PRIMARY KEY (`ID`, `APPM_APPLICATION_ID`),
|
PRIMARY KEY (`APPM_APPLICATION_ID`, `VERSION_NAME`),
|
||||||
INDEX `FK_APPLICATION_VERSION_APPLICATION` (`APPM_APPLICATION_ID` ASC),
|
INDEX `FK_APPLICATION_VERSION_APPLICATION` (`APPM_APPLICATION_ID` ASC),
|
||||||
CONSTRAINT `FK_APPLICATION_VERSION_APPLICATION`
|
CONSTRAINT `FK_APPLICATION_VERSION_APPLICATION`
|
||||||
FOREIGN KEY (`APPM_APPLICATION_ID`)
|
FOREIGN KEY (`APPM_APPLICATION_ID`)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user