Added try/catch to prevent ClientAbortException java.net.SocketException Broken Pipe
git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/user/workspace-tree-widget@117251 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
2b0bf9c3d0
commit
2d93244574
|
@ -161,13 +161,6 @@ public class LocalUploadServlet extends HttpServlet {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
if (file == null) {
|
|
||||||
logger.error("Error processing request in upload servlet: No file to upload");
|
|
||||||
sendError(response, "Internal error: No file to upload");
|
|
||||||
return;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
if (destinationId == null) {
|
if (destinationId == null) {
|
||||||
logger.error("Error processing request in upload servlet: No destination folder id found");
|
logger.error("Error processing request in upload servlet: No destination folder id found");
|
||||||
sendError(response, "Internal error: No destination folder id found");
|
sendError(response, "Internal error: No destination folder id found");
|
||||||
|
@ -221,43 +214,21 @@ public class LocalUploadServlet extends HttpServlet {
|
||||||
String contentType = MimeTypeUtil.getMimeType(itemName, new BufferedInputStream(fileUploadIS));
|
String contentType = MimeTypeUtil.getMimeType(itemName, new BufferedInputStream(fileUploadIS));
|
||||||
logger.trace("Content type (mime type): "+contentType + " unique name: "+itemName);
|
logger.trace("Content type (mime type): "+contentType + " unique name: "+itemName);
|
||||||
|
|
||||||
// System.out.println("Content type: "+contentType + " unique name: "+itemName);
|
|
||||||
|
|
||||||
String extension = FilenameUtils.getExtension(itemName);
|
String extension = FilenameUtils.getExtension(itemName);
|
||||||
logger.trace("extension: "+extension);
|
logger.trace("extension: "+extension);
|
||||||
|
|
||||||
// System.out.println("extension: "+extension);
|
|
||||||
|
|
||||||
if(uploadType.compareTo(FILE)==0) {//IS FILE UPLOAD
|
if(uploadType.compareTo(FILE)==0) {//IS FILE UPLOAD
|
||||||
|
|
||||||
boolean isZipFile = MimeTypeUtil.isZipContentType(contentType);
|
boolean isZipFile = MimeTypeUtil.isZipContentType(contentType);
|
||||||
|
|
||||||
if(isZipFile && (extension.compareToIgnoreCase(D4ST)==0)){ //Create REPORT TEMPLATE
|
if(isZipFile && (extension.compareToIgnoreCase(D4ST)==0)){ //Create REPORT TEMPLATE
|
||||||
|
|
||||||
// String newItemName = "";
|
|
||||||
//
|
|
||||||
// if(!isOverwrite)
|
|
||||||
// newItemName = itemName.substring(0,itemName.lastIndexOf(D4ST)-1); //remove extension
|
|
||||||
// else
|
|
||||||
// newItemName = item.getName();
|
|
||||||
|
|
||||||
// System.out.println("itemwithoutext " +itemwithoutext);
|
|
||||||
|
|
||||||
String newItemName = itemName;
|
String newItemName = itemName;
|
||||||
|
|
||||||
logger.trace("createTemplate: "+newItemName);
|
logger.trace("createTemplate: "+newItemName);
|
||||||
createTemplate(request.getSession(), wa, newItemName, openInputStream(file), destinationFolder, response, isOverwrite);
|
createTemplate(request.getSession(), wa, newItemName, openInputStream(file), destinationFolder, response, isOverwrite);
|
||||||
|
|
||||||
}else if(isZipFile && (extension.compareToIgnoreCase(D4SR)==0)){ //Create REPORT
|
}else if(isZipFile && (extension.compareToIgnoreCase(D4SR)==0)){ //Create REPORT
|
||||||
|
|
||||||
// String newItemName = "";
|
|
||||||
//
|
|
||||||
// if(!isOverwrite)
|
|
||||||
// newItemName = itemName.substring(0,itemName.lastIndexOf(D4SR)-1); //remove extension
|
|
||||||
// else
|
|
||||||
// newItemName = item.getName();
|
|
||||||
|
|
||||||
// System.out.println("itemwithoutext " +itemwithoutext);
|
|
||||||
String newItemName = itemName;
|
String newItemName = itemName;
|
||||||
logger.trace("createReport: "+newItemName);
|
logger.trace("createReport: "+newItemName);
|
||||||
createReport(request.getSession(), wa, newItemName, openInputStream(file), destinationFolder, response, isOverwrite);
|
createReport(request.getSession(), wa, newItemName, openInputStream(file), destinationFolder, response, isOverwrite);
|
||||||
|
@ -299,11 +270,6 @@ public class LocalUploadServlet extends HttpServlet {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//} catch (IOException e) {
|
|
||||||
// logger.error("Error creating elements", e);
|
|
||||||
// sendError(response, "Internal error: "+e.getMessage());
|
|
||||||
// return;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param file
|
* @param file
|
||||||
|
@ -336,23 +302,16 @@ public class LocalUploadServlet extends HttpServlet {
|
||||||
private void notifyUploadInSharedFolder(final HttpSession httpSession, final Workspace workspace, final String itemId, final String destinationFolderId, final boolean isOverwrite){
|
private void notifyUploadInSharedFolder(final HttpSession httpSession, final Workspace workspace, final String itemId, final String destinationFolderId, final boolean isOverwrite){
|
||||||
|
|
||||||
new Thread(){
|
new Thread(){
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
WorkspaceItem sourceItem;
|
WorkspaceItem sourceItem;
|
||||||
try {
|
try {
|
||||||
sourceItem = workspace.getItem(itemId);
|
sourceItem = workspace.getItem(itemId);
|
||||||
String sourceSharedId = sourceItem.getIdSharedFolder();
|
String sourceSharedId = sourceItem.getIdSharedFolder();
|
||||||
WorkspaceItem folderDestinationItem = workspace.getItem(destinationFolderId);
|
WorkspaceItem folderDestinationItem = workspace.getItem(destinationFolderId);
|
||||||
|
|
||||||
NotificationsUtil.checkSendNotifyChangedItemToShare(httpSession, sourceItem, sourceSharedId, folderDestinationItem,isOverwrite);
|
NotificationsUtil.checkSendNotifyChangedItemToShare(httpSession, sourceItem, sourceSharedId, folderDestinationItem,isOverwrite);
|
||||||
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error("Error in notifyUploadInSharedFolder", e);
|
logger.error("Error in notifyUploadInSharedFolder", e);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}.start();
|
}.start();
|
||||||
|
@ -374,7 +333,6 @@ public class LocalUploadServlet extends HttpServlet {
|
||||||
|
|
||||||
if(createdItem!=null){
|
if(createdItem!=null){
|
||||||
notifyUploadInSharedFolder(httpSession,wa,createdItem.getId(),destinationFolder.getId(), isOverwrite);
|
notifyUploadInSharedFolder(httpSession,wa,createdItem.getId(),destinationFolder.getId(), isOverwrite);
|
||||||
|
|
||||||
sendMessage(response, "File "+createdItem.getName()+" imported correctly in "+destinationFolder.getPath());
|
sendMessage(response, "File "+createdItem.getName()+" imported correctly in "+destinationFolder.getPath());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -426,7 +384,6 @@ public class LocalUploadServlet extends HttpServlet {
|
||||||
report = wa.createReport(itemName, "", Calendar.getInstance(), Calendar.getInstance(), "", "", "", 0, "", stream, destinationFolder.getId());
|
report = wa.createReport(itemName, "", Calendar.getInstance(), Calendar.getInstance(), "", "", "", 0, "", stream, destinationFolder.getId());
|
||||||
|
|
||||||
notifyUploadInSharedFolder(httpSession,wa,report.getId(),destinationFolder.getId(), isOverwrite);
|
notifyUploadInSharedFolder(httpSession,wa,report.getId(),destinationFolder.getId(), isOverwrite);
|
||||||
|
|
||||||
sendMessage(response, "File "+report.getName()+" imported correctly in "+destinationFolder.getPath());
|
sendMessage(response, "File "+report.getName()+" imported correctly in "+destinationFolder.getPath());
|
||||||
}
|
}
|
||||||
else{ //CASE OVERWRITE
|
else{ //CASE OVERWRITE
|
||||||
|
@ -435,12 +392,10 @@ public class LocalUploadServlet extends HttpServlet {
|
||||||
if(rep!=null){
|
if(rep!=null){
|
||||||
|
|
||||||
notifyUploadInSharedFolder(httpSession,wa,rep.getId(),destinationFolder.getId(), isOverwrite);
|
notifyUploadInSharedFolder(httpSession,wa,rep.getId(),destinationFolder.getId(), isOverwrite);
|
||||||
|
|
||||||
sendMessage(response, "File "+rep.getName()+" imported correctly in "+destinationFolder.getPath());
|
sendMessage(response, "File "+rep.getName()+" imported correctly in "+destinationFolder.getPath());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
sendError(response,"Internal error: Workspace Item Not Found");
|
sendError(response,"Internal error: Workspace Item Not Found");
|
||||||
|
|
||||||
}
|
}
|
||||||
} catch (WrongDestinationException e) {
|
} catch (WrongDestinationException e) {
|
||||||
logger.error("Error creating elements", e);
|
logger.error("Error creating elements", e);
|
||||||
|
@ -463,7 +418,6 @@ public class LocalUploadServlet extends HttpServlet {
|
||||||
template = wa.createReportTemplate(itemName, "", Calendar.getInstance(), Calendar.getInstance(), "", "", 0, "", stream, destinationFolder.getId());
|
template = wa.createReportTemplate(itemName, "", Calendar.getInstance(), Calendar.getInstance(), "", "", 0, "", stream, destinationFolder.getId());
|
||||||
|
|
||||||
notifyUploadInSharedFolder(httpSession,wa,template.getId(),destinationFolder.getId(), isOverwrite);
|
notifyUploadInSharedFolder(httpSession,wa,template.getId(),destinationFolder.getId(), isOverwrite);
|
||||||
|
|
||||||
sendMessage(response, "File "+template.getName()+" imported correctly in "+destinationFolder.getPath());
|
sendMessage(response, "File "+template.getName()+" imported correctly in "+destinationFolder.getPath());
|
||||||
|
|
||||||
}else{ //CASE OVERWRITE
|
}else{ //CASE OVERWRITE
|
||||||
|
@ -472,12 +426,10 @@ public class LocalUploadServlet extends HttpServlet {
|
||||||
if(rep!=null){
|
if(rep!=null){
|
||||||
|
|
||||||
notifyUploadInSharedFolder(httpSession,wa,rep.getId(),destinationFolder.getId(), isOverwrite);
|
notifyUploadInSharedFolder(httpSession,wa,rep.getId(),destinationFolder.getId(), isOverwrite);
|
||||||
|
|
||||||
sendMessage(response, "File "+rep.getName()+" imported correctly in "+destinationFolder.getPath());
|
sendMessage(response, "File "+rep.getName()+" imported correctly in "+destinationFolder.getPath());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
sendError(response,"Internal error: Workspace Item Not Found");
|
sendError(response,"Internal error: Workspace Item Not Found");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (WrongDestinationException e) {
|
} catch (WrongDestinationException e) {
|
||||||
|
@ -491,29 +443,48 @@ public class LocalUploadServlet extends HttpServlet {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected void sendError(HttpServletResponse response, String message) throws IOException
|
protected void sendError(HttpServletResponse response, String message) throws IOException{
|
||||||
{
|
try {
|
||||||
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
|
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
|
||||||
HandlerResultMessage resultMessage = HandlerResultMessage.errorResult(message);
|
HandlerResultMessage resultMessage = HandlerResultMessage.errorResult(message);
|
||||||
response.getWriter().write(resultMessage.toString());
|
response.getWriter().write(resultMessage.toString());
|
||||||
response.flushBuffer();
|
response.flushBuffer();
|
||||||
|
} catch (IOException e){
|
||||||
|
logger.warn("IOException class name: "+e.getClass().getSimpleName());
|
||||||
|
if (e.getClass().getSimpleName().equals("ClientAbortException"))
|
||||||
|
logger.warn("Skipping ClientAbortException: "+e.getMessage());
|
||||||
|
else
|
||||||
|
throw e; //Sending Exceptions
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void sendMessage(HttpServletResponse response, String message) throws IOException
|
protected void sendMessage(HttpServletResponse response, String message) throws IOException{
|
||||||
{
|
try {
|
||||||
response.setStatus(HttpServletResponse.SC_ACCEPTED);
|
response.setStatus(HttpServletResponse.SC_ACCEPTED);
|
||||||
HandlerResultMessage resultMessage = HandlerResultMessage.okResult(message);
|
HandlerResultMessage resultMessage = HandlerResultMessage.okResult(message);
|
||||||
response.getWriter().write(resultMessage.toString());
|
response.getWriter().write(resultMessage.toString());
|
||||||
response.flushBuffer();
|
response.flushBuffer();
|
||||||
|
} catch (IOException e){
|
||||||
|
logger.warn("IOException class name: "+e.getClass().getSimpleName());
|
||||||
|
if (e.getClass().getSimpleName().equals("ClientAbortException"))
|
||||||
|
logger.warn("Skipping ClientAbortException: "+e.getMessage());
|
||||||
|
else
|
||||||
|
throw e; //Sending Exceptions
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void sendWarnMessage(HttpServletResponse response, String message) throws IOException
|
protected void sendWarnMessage(HttpServletResponse response, String message) throws IOException{
|
||||||
{
|
try {
|
||||||
response.setStatus(HttpServletResponse.SC_ACCEPTED);
|
response.setStatus(HttpServletResponse.SC_ACCEPTED);
|
||||||
HandlerResultMessage resultMessage = HandlerResultMessage.warnResult(message);
|
HandlerResultMessage resultMessage = HandlerResultMessage.warnResult(message);
|
||||||
response.getWriter().write(resultMessage.toString());
|
response.getWriter().write(resultMessage.toString());
|
||||||
response.flushBuffer();
|
response.flushBuffer();
|
||||||
|
} catch (IOException e){
|
||||||
|
logger.warn("IOException class name: "+e.getClass().getSimpleName());
|
||||||
|
if (e.getClass().getSimpleName().equals("ClientAbortException"))
|
||||||
|
logger.warn("Skipping ClientAbortException: "+e.getMessage());
|
||||||
|
else
|
||||||
|
throw e; //Sending Exceptions
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,86 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package org.gcube.portlets.user.workspace;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.gcube.common.homelibrary.home.HomeLibrary;
|
||||||
|
import org.gcube.common.homelibrary.home.exceptions.HomeNotFoundException;
|
||||||
|
import org.gcube.common.homelibrary.home.exceptions.InternalErrorException;
|
||||||
|
import org.gcube.common.homelibrary.home.exceptions.UserNotFoundException;
|
||||||
|
import org.gcube.common.homelibrary.home.workspace.Workspace;
|
||||||
|
import org.gcube.common.homelibrary.home.workspace.WorkspaceSharedFolder;
|
||||||
|
import org.gcube.common.homelibrary.home.workspace.exceptions.InsufficientPrivilegesException;
|
||||||
|
import org.gcube.common.homelibrary.home.workspace.exceptions.ItemAlreadyExistException;
|
||||||
|
import org.gcube.common.homelibrary.home.workspace.exceptions.ItemNotFoundException;
|
||||||
|
import org.gcube.common.homelibrary.home.workspace.exceptions.WorkspaceFolderNotFoundException;
|
||||||
|
import org.gcube.common.homelibrary.home.workspace.exceptions.WrongDestinationException;
|
||||||
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
|
import org.gcube.common.scope.impl.ScopeBean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it Jul 14, 2015
|
||||||
|
*/
|
||||||
|
public class CreateSharedFolder {
|
||||||
|
|
||||||
|
protected static Logger logger = Logger.getLogger(CreateSharedFolder.class);
|
||||||
|
// public static String DEFAULT_SCOPE = "/d4science.research-infrastructures.eu/gCubeApps/EcologicalModelling"; //PRODUCTION
|
||||||
|
public static String DEFAULT_SCOPE = "/gcube/devsec"; //DEV
|
||||||
|
|
||||||
|
public static String USER = "francesco.mangiacrapa"; //PRODUCTION
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
ScopeBean scope = new ScopeBean(DEFAULT_SCOPE);
|
||||||
|
ScopeProvider.instance.set(scope.toString());
|
||||||
|
Workspace workspace = HomeLibrary.getHomeManagerFactory()
|
||||||
|
.getHomeManager().getHome(USER)
|
||||||
|
.getWorkspace();
|
||||||
|
|
||||||
|
String folderName = "Test Folder";
|
||||||
|
String desc = "descr";
|
||||||
|
List<String> listLogin = new ArrayList<String>();
|
||||||
|
|
||||||
|
listLogin.add("valentina.marioli");
|
||||||
|
listLogin.add("massimiliano.assante");
|
||||||
|
|
||||||
|
WorkspaceSharedFolder sharedFolder = workspace.createSharedFolder(
|
||||||
|
folderName, desc, listLogin, workspace.getRoot().getId());
|
||||||
|
|
||||||
|
if (sharedFolder == null)
|
||||||
|
System.out.println("shared folder is null");
|
||||||
|
|
||||||
|
System.out
|
||||||
|
.println("Shared folder created: " + sharedFolder.getId());
|
||||||
|
} catch (InsufficientPrivilegesException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (ItemAlreadyExistException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (WrongDestinationException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (ItemNotFoundException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (WorkspaceFolderNotFoundException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (InternalErrorException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (HomeNotFoundException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (UserNotFoundException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -29,12 +29,12 @@ import org.gcube.common.scope.impl.ScopeBean;
|
||||||
public class ItemRetrieve {
|
public class ItemRetrieve {
|
||||||
|
|
||||||
|
|
||||||
public static String DEFAULT_SCOPE = "/d4science.research-infrastructures.eu/gCubeApps"; //PRODUCTION
|
// public static String DEFAULT_SCOPE = "/d4science.research-infrastructures.eu/gCubeApps"; //PRODUCTION
|
||||||
// public static String DEFAULT_SCOPE = "/gcube/devsec"; //DEV
|
public static String DEFAULT_SCOPE = "/gcube/devsec"; //DEV
|
||||||
public static String TEST_USER = "francesco.mangiacrapa";
|
public static String TEST_USER = "francesco.mangiacrapa";
|
||||||
// public static String ITEMID = "63832213-098d-42d1-8774-89b6349764c0"; //Activity T3.4 working drafts/T2-EC-IMAR-HO-14-015 iMarine Sustainability WP - Business Model tools.pdf
|
// public static String ITEMID = "63832213-098d-42d1-8774-89b6349764c0"; //Activity T3.4 working drafts/T2-EC-IMAR-HO-14-015 iMarine Sustainability WP - Business Model tools.pdf
|
||||||
public static String ITEMID = "ec8bcf91-0969-450e-971c-a273c114d9e4";
|
public static String ITEMID = "d81d3a64-603f-4907-ae74-be8353211807";
|
||||||
|
// d81d3a64-603f-4907-ae74-be8353211807
|
||||||
protected static Logger logger = Logger.getLogger(ItemRetrieve.class);
|
protected static Logger logger = Logger.getLogger(ItemRetrieve.class);
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,9 +46,12 @@ public class ItemRetrieve {
|
||||||
System.out.println("init HL");
|
System.out.println("init HL");
|
||||||
try {
|
try {
|
||||||
Workspace ws = getWorkspace();
|
Workspace ws = getWorkspace();
|
||||||
|
|
||||||
|
retrieveFirstLevel(ws, ITEMID);
|
||||||
|
|
||||||
System.out.println("get workspace -> OK");
|
System.out.println("get workspace -> OK");
|
||||||
WorkspaceItem item = ws.getItem(ITEMID);
|
WorkspaceItem item = ws.getItem(ITEMID);
|
||||||
System.out.println("get item -> OK");
|
System.out.println("get item id: "+item.getId()+", name: "+item.getName() +", parent: "+item.getParent());
|
||||||
System.out.println(item);
|
System.out.println(item);
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -82,7 +85,7 @@ public class ItemRetrieve {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static void retrieveFirstLevel(Workspace ws){
|
private static void retrieveFirstLevel(Workspace ws, String foundID){
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
@ -109,6 +112,14 @@ public class ItemRetrieve {
|
||||||
int othersCounter = 0;
|
int othersCounter = 0;
|
||||||
for (WorkspaceItem workspaceItem : children) {
|
for (WorkspaceItem workspaceItem : children) {
|
||||||
|
|
||||||
|
if(foundID!=null && !foundID.isEmpty()){
|
||||||
|
if(workspaceItem.getId().compareTo(foundID)==0){
|
||||||
|
System.out.println("ITEM FOUND id: "+workspaceItem.getId()+", name: "+workspaceItem.getName());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
switch (workspaceItem.getType()) {
|
switch (workspaceItem.getType()) {
|
||||||
|
|
||||||
case FOLDER:
|
case FOLDER:
|
||||||
|
|
Loading…
Reference in New Issue