/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cids.custom.switchon.wizards.panels;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.openide.WizardDescriptor;
import java.awt.datatransfer.DataFlavor;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.List;
import java.util.ResourceBundle;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import javax.swing.SwingWorker;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import de.cismet.cids.custom.switchon.gui.InfoReceiver;
import de.cismet.cids.custom.switchon.utils.TagUtils;
import de.cismet.cids.dynamics.CidsBean;
import de.cismet.cids.dynamics.CidsBeanStore;
import de.cismet.cismap.commons.util.DnDUtils;
import de.cismet.commons.security.WebDavClient;
import de.cismet.commons.security.WebDavHelper;
import de.cismet.netutil.Proxy;
import de.cismet.tools.PasswordEncrypter;
/**
* DOCUMENT ME!
*
* @author Gilles Baatz
* @version $Revision$, $Date$
*/
public class BasicImportDocumentVisualPanel extends javax.swing.JPanel implements CidsBeanStore, InfoReceiver {
//~ Static fields/initializers ---------------------------------------------
private static final long ONEHUNDRED_KILOBYTES = (long)1e5;
private static final transient org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(
BasicImportDocumentVisualPanel.class);
private static String WEB_DAV_USER;
private static String WEB_DAV_PASSWORD;
private static String BASIC_IMPORT_URL;
private static String RESOURCE_TYPE_FOLDER;
private static String RESOURCE_TYPE_FOLDER_UNKOWN;
private static String TAGGROUP_NOT_SET_FOLDER;
private static final Future<CidsBean> GEOSERVER;
private static CidsBean functionCidsBean;
private static CidsBean protocolCidsBean;
static {
GEOSERVER = TagUtils.fetchFutureTagByName("geoserver");
try {
final ResourceBundle bundle = ResourceBundle.getBundle(
"de/cismet/cids/custom/switchon/wizards/panels/webdav/WebDav"); // NOI18N
final String pass = bundle.getString("password");
WEB_DAV_PASSWORD = String.valueOf(PasswordEncrypter.decrypt(pass.toCharArray(), true));
WEB_DAV_USER = bundle.getString("user");
BASIC_IMPORT_URL = bundle.getString("url_basic_import");
RESOURCE_TYPE_FOLDER = bundle.getString("resourceTypeFolder");
RESOURCE_TYPE_FOLDER_UNKOWN = bundle.getString("resourceTypeFolderUnkown");
TAGGROUP_NOT_SET_FOLDER = bundle.getString("taggroupNotSetFolder");
} catch (Exception ex) {
LOG.error(
"Could not read WebDav properties from property file", // NOI18N
ex);
WEB_DAV_PASSWORD = ""; // NOI18N
WEB_DAV_USER = ""; // NOI18N
BASIC_IMPORT_URL = ""; // NOI18N
RESOURCE_TYPE_FOLDER = "WP3"; // NOI18N
RESOURCE_TYPE_FOLDER_UNKOWN = "default"; // NOI18N
TAGGROUP_NOT_SET_FOLDER = "default"; // NOI18N
}
}
//~ Instance fields --------------------------------------------------------
private boolean saveInContentAllowed = true;
private CidsBean cidsBean;
private CidsBean resource;
private WizardDescriptor wizard;
private String wizardPropertyToIndicateIfImportButtonWasPressed;
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnImport;
private javax.swing.JCheckBox chbPublish;
private de.cismet.cids.custom.switchon.wizards.WizardInfoBoxPanel infoBoxPanel;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JLabel lblFileChooser;
private javax.swing.JLabel lblStatus;
private javax.swing.JPanel pnlImport;
private javax.swing.JProgressBar prbStatus;
private javax.swing.JTextArea txtLocation;
// End of variables declaration//GEN-END:variables
//~ Constructors -----------------------------------------------------------
/**
* Creates new form ImportDocumentVisualPanel.
*/
public BasicImportDocumentVisualPanel() {
initComponents();
txtLocation.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(final DocumentEvent e) {
isFile();
}
@Override
public void removeUpdate(final DocumentEvent e) {
isFile();
}
@Override
public void changedUpdate(final DocumentEvent e) {
isFile();
}
private void isFile() {
final Path path = Paths.get(txtLocation.getText());
final boolean canImport = Files.isRegularFile(path) && Files.isReadable(path);
btnImport.setEnabled(canImport);
}
});
new DropTarget(pnlImport, new FileDropListener());
new DropTarget(txtLocation, new FileDropListener());
}
//~ Methods ----------------------------------------------------------------
/**
* This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The
* content of this method is always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
pnlImport = new javax.swing.JPanel();
txtLocation = new javax.swing.JTextArea();
lblFileChooser = new javax.swing.JLabel();
btnImport = new javax.swing.JButton();
chbPublish = new javax.swing.JCheckBox();
jPanel2 = new javax.swing.JPanel();
prbStatus = new javax.swing.JProgressBar();
jPanel3 = new javax.swing.JPanel();
lblStatus = new javax.swing.JLabel();
infoBoxPanel = new de.cismet.cids.custom.switchon.wizards.WizardInfoBoxPanel();
setLayout(new java.awt.GridBagLayout());
pnlImport.setBorder(javax.swing.BorderFactory.createTitledBorder(
org.openide.util.NbBundle.getMessage(
BasicImportDocumentVisualPanel.class,
"BasicImportDocumentVisualPanel.pnlImport.border.title"))); // NOI18N
pnlImport.setLayout(new java.awt.GridBagLayout());
txtLocation.setColumns(20);
txtLocation.setLineWrap(true);
txtLocation.setRows(1);
txtLocation.setDisabledTextColor(new java.awt.Color(0, 0, 0));
txtLocation.setEnabled(false);
txtLocation.setOpaque(false);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10);
pnlImport.add(txtLocation, gridBagConstraints);
lblFileChooser.setIcon(new javax.swing.ImageIcon(
getClass().getResource("/de/cismet/cids/custom/switchon/document_import.png"))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(
lblFileChooser,
org.openide.util.NbBundle.getMessage(
BasicImportDocumentVisualPanel.class,
"BasicImportDocumentVisualPanel.lblFileChooser.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10);
pnlImport.add(lblFileChooser, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(
btnImport,
org.openide.util.NbBundle.getMessage(
BasicImportDocumentVisualPanel.class,
"BasicImportDocumentVisualPanel.btnImport.text")); // NOI18N
btnImport.setEnabled(false);
btnImport.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
btnImportActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10);
pnlImport.add(btnImport, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(
chbPublish,
org.openide.util.NbBundle.getMessage(
BasicImportDocumentVisualPanel.class,
"BasicImportDocumentVisualPanel.chbPublish.text")); // NOI18N
chbPublish.setEnabled(false);
chbPublish.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
chbPublishActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 10);
pnlImport.add(chbPublish, gridBagConstraints);
chbPublish.setVisible(false);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 10, 10, 10);
add(pnlImport, gridBagConstraints);
jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
jPanel2.setLayout(new java.awt.GridBagLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10);
jPanel2.add(prbStatus, gridBagConstraints);
jPanel3.setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(
lblStatus,
org.openide.util.NbBundle.getMessage(
BasicImportDocumentVisualPanel.class,
"BasicImportDocumentVisualPanel.lblStatus.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 5);
jPanel3.add(lblStatus, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
jPanel2.add(jPanel3, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 10, 10, 10);
add(jPanel2, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(10, 10, 5, 10);
add(infoBoxPanel, gridBagConstraints);
} // </editor-fold>//GEN-END:initComponents
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void btnImportActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_btnImportActionPerformed
final String pathStr = txtLocation.getText();
new CreateContent(Paths.get(pathStr)).execute();
} //GEN-LAST:event_btnImportActionPerformed
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void chbPublishActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_chbPublishActionPerformed
try {
// remove all publish styles
final Collection<CidsBean> tags = getCidsBean().getBeanCollectionProperty("tags");
tags.remove(GEOSERVER.get());
if (chbPublish.isSelected()) {
final String contentType = getCidsBean().getProperty("contenttype").toString();
switch (contentType) {
case "image/tiff":
case "image/geotiff":
case "application/zip":
case "application/shp": {
tags.add(GEOSERVER.get());
break;
}
}
}
} catch (InterruptedException ex) {
LOG.error(ex, ex);
} catch (ExecutionException ex) {
LOG.error(ex, ex);
}
} //GEN-LAST:event_chbPublishActionPerformed
@Override
public CidsBean getCidsBean() {
return cidsBean;
}
@Override
public void setCidsBean(final CidsBean cidsBean) {
this.cidsBean = cidsBean;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public CidsBean getResource() {
return resource;
}
/**
* DOCUMENT ME!
*
* @param resource DOCUMENT ME!
*/
public void setResource(final CidsBean resource) {
this.resource = resource;
}
/**
* DOCUMENT ME!
*
* @param contentInformation DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
private void setContentInformationToCidsBean(final ContentInformation contentInformation) throws Exception {
if ((cidsBean != null) && (contentInformation != null)) {
if (contentInformation.contentType != null) {
cidsBean.setProperty("contenttype", contentInformation.contentType); // NOI18N
}
if (contentInformation.contentLocation != null) {
cidsBean.setProperty("contentlocation", contentInformation.contentLocation); // NOI18N
}
if (contentInformation.content != null) {
cidsBean.setProperty("content", contentInformation.content); // NOI18N
}
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean isSaveInContentAllowed() {
return saveInContentAllowed;
}
/**
* A boolean which enables or disables that the content of the chosen file is saved directly in the database. If
* saveInContentAllowed is false, the file will always be uploaded to the WebDav.
*
* @param saveInContentAllowed DOCUMENT ME!
*/
public void setSaveInContentAllowed(final boolean saveInContentAllowed) {
this.saveInContentAllowed = saveInContentAllowed;
}
/**
* DOCUMENT ME!
*
* @param contentType DOCUMENT ME!
*/
private void checkUploadToAdvancedDataRepositoryPossible(final String contentType) {
try {
boolean uploadPossible = false;
if ("image/geotiff".equals(contentType) || "application/shp".equals(contentType)
|| "image/tiff".equals(contentType) || "application/zip".equals(contentType)) {
uploadPossible = true;
}
chbPublish.setEnabled(uploadPossible);
if (!uploadPossible) {
chbPublish.setSelected(false);
// remove all publish styles
final Collection<CidsBean> tags = getCidsBean().getBeanCollectionProperty("tags");
tags.remove(GEOSERVER.get());
}
} catch (InterruptedException ex) {
LOG.error(ex, ex);
} catch (ExecutionException ex) {
LOG.error(ex, ex);
}
}
/**
* DOCUMENT ME!
*
* @param visible DOCUMENT ME!
*/
protected void setCheckboxPublishToAdvancedDataRepositoryVisible(final boolean visible) {
chbPublish.setVisible(visible);
}
/**
* DOCUMENT ME!
*
* @param wizard DOCUMENT ME!
*/
public void setWizard(final WizardDescriptor wizard) {
this.wizard = wizard;
}
/**
* DOCUMENT ME!
*
* @param wizardPropertyToIndicateIfImportButtonWasPressed DOCUMENT ME!
*/
public void setWizardPropertyToIndicateIfImportButtonWasPressed(
final String wizardPropertyToIndicateIfImportButtonWasPressed) {
this.wizardPropertyToIndicateIfImportButtonWasPressed = wizardPropertyToIndicateIfImportButtonWasPressed;
}
@Override
public void setInformation(final String information) {
infoBoxPanel.setInformation(information);
}
@Override
public void setError(final String error) {
infoBoxPanel.setError(error);
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class CreateContent extends SwingWorker<ContentInformation, ProcessInformation> {
//~ Instance fields ----------------------------------------------------
private final Path path;
//~ Constructors -------------------------------------------------------
/**
* Creates a new CreateContent object.
*
* @param path DOCUMENT ME!
*/
public CreateContent(final Path path) {
this.path = path;
}
//~ Methods ------------------------------------------------------------
@Override
protected ContentInformation doInBackground() throws Exception {
publish(new ProcessInformation(
org.openide.util.NbBundle.getMessage(
BasicImportDocumentVisualPanel.class,
"BasicImportDocumentVisualPanel.CreateContent.fetchContent"), // NOI18N
0));
final ContentInformation information = new ContentInformation();
final String contentType = Files.probeContentType(path);
fetchContentTypeTag(contentType, information);
fetchFunctionAndProtocolTags();
boolean upload = true;
if (upload && (contentType != null) && contentType.startsWith("text")) { // NOI18N
final long size = Files.size(path);
upload = size > ONEHUNDRED_KILOBYTES;
}
if (saveInContentAllowed && !upload) {
publish(new ProcessInformation(
org.openide.util.NbBundle.getMessage(
BasicImportDocumentVisualPanel.class,
"BasicImportDocumentVisualPanel.CreateContent.Save"), // NOI18N
25));
saveContent(path, information);
} else {
publish(new ProcessInformation(
org.openide.util.NbBundle.getMessage(
BasicImportDocumentVisualPanel.class,
"BasicImportDocumentVisualPanel.CreateContent.Upload"), // NOI18N
25));
final int responseCode = uploadContent(path, information);
if ((responseCode < 200) || (responseCode >= 300)) {
throw new UploadNotSuccessfullException(
responseCode,
"The upload failed. Http response code is: " // NOI18N
+ responseCode);
}
}
return information;
}
@Override
protected void process(final List<ProcessInformation> chunks) {
if (!chunks.isEmpty()) {
showProcess(chunks.get(chunks.size() - 1));
}
}
@Override
protected void done() {
String processMessage;
try {
final ContentInformation information = get();
setContentInformationToCidsBean(information);
checkUploadToAdvancedDataRepositoryPossible((information.contentType == null)
? "" : information.contentType.toString());
setFunctionAndProtocolForRepresentation();
processMessage = org.openide.util.NbBundle.getMessage(
BasicImportDocumentVisualPanel.class,
"BasicImportDocumentVisualPanel.CreateContent.finished"); // NOI18N
if (wizard != null) {
wizard.putProperty(wizardPropertyToIndicateIfImportButtonWasPressed, Boolean.TRUE);
}
} catch (InterruptedException ex) {
LOG.error(ex, ex);
processMessage = "Upload failed!";
} catch (ExecutionException ex) {
LOG.error(ex, ex);
final Throwable cause = ex.getCause();
if (cause instanceof UploadNotSuccessfullException) {
final int statusCode = ((UploadNotSuccessfullException)cause).responseCode;
processMessage = "Upload failed: " + statusCode + " - " + HttpStatus.getStatusText(statusCode);
} else {
processMessage = "Upload failed!";
}
} catch (Exception ex) {
LOG.error(ex, ex);
processMessage = "Upload failed!";
}
showProcess(new ProcessInformation(processMessage,
100));
}
/**
* DOCUMENT ME!
*
* @param processInformation DOCUMENT ME!
*/
private void showProcess(final ProcessInformation processInformation) {
prbStatus.setValue(processInformation.processInPercent);
lblStatus.setText(processInformation.message);
}
/**
* DOCUMENT ME!
*
* @param contentType DOCUMENT ME!
* @param information DOCUMENT ME!
*/
private void fetchContentTypeTag(final String contentType, final ContentInformation information) {
information.contentType = TagUtils.fetchTagByName(contentType);
}
/**
* DOCUMENT ME!
*
* @param path DOCUMENT ME!
* @param information DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
private int uploadContent(final Path path, final ContentInformation information) throws Exception {
final WebDavClient webdavclient = new WebDavClient(Proxy.fromPreferences(),
WEB_DAV_USER,
WEB_DAV_PASSWORD,
true);
final String filename = FilenameUtils.getName(path.toString());
final String url = determineUrl(webdavclient, filename);
final String message = java.text.MessageFormat.format(java.util.ResourceBundle.getBundle(
"de/cismet/cids/custom/switchon/wizards/panels/Bundle").getString( // NOI18N
"BasicImportDocumentVisualPanel.CreateContent.uploadTo"), // NOI18N
url);
publish(new ProcessInformation(message, 50));
final int responseCode = WebDavHelper.uploadFileToWebDAV(
"",
path.toFile(),
url,
webdavclient,
BasicImportDocumentVisualPanel.this);
information.content = null;
information.contentLocation = url;
return responseCode;
}
/**
* DOCUMENT ME!
*
* @param webdavclient DOCUMENT ME!
* @param filename DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private String determineUrl(final WebDavClient webdavclient, final String filename) {
String resourceTypeFolder = RESOURCE_TYPE_FOLDER_UNKOWN;
String geographyFolder = "";
String hydrologicalConceptFolder = "";
if (resource != null) {
final CidsBean resourceType = (CidsBean)resource.getProperty("type"); // NOI18N
if (resourceType != null) {
final String resourceTypeName = (String)resourceType.getProperty("name"); // NOI18N
if (resourceTypeName.equals("repurposed data")
|| resourceTypeName.equals("experiment result data") // NOI18N
|| resourceTypeName.equals("repurposed experiment result data")) { // NOI18N
resourceTypeFolder = RESOURCE_TYPE_FOLDER;
}
}
final List<CidsBean> tags = resource.getBeanCollectionProperty("tags"); // NOI18N
final CidsBean geographyTag = TagUtils.returnFirstOccurrenceOfTaggroup(tags, "geography"); // NOI18N
if (geographyTag != null) {
geographyFolder = (String)geographyTag.getProperty("name"); // NOI18N
}
final CidsBean hydrologicalConceptTag = TagUtils.returnFirstOccurrenceOfTaggroup(
tags,
"hydrological concept"); // NOI18N
if (hydrologicalConceptTag != null) {
hydrologicalConceptFolder = (String)hydrologicalConceptTag.getProperty("name"); // NOI18N
}
}
String urlBase = BASIC_IMPORT_URL.endsWith("/") ? (BASIC_IMPORT_URL + urlEncode(resourceTypeFolder))
: (BASIC_IMPORT_URL + '/' + urlEncode(resourceTypeFolder));
checkAndCreateFolder(webdavclient, urlBase);
if ((geographyFolder != null) && (geographyFolder.length() > 0)) {
urlBase += "/" + urlEncode(geographyFolder);
checkAndCreateFolder(webdavclient, urlBase);
}
if ((hydrologicalConceptFolder != null) && (hydrologicalConceptFolder.length() > 0)) {
urlBase += "/" + urlEncode(hydrologicalConceptFolder);
checkAndCreateFolder(webdavclient, urlBase);
}
urlBase += urlBase.endsWith("/") ? "" : "/";
final String baseName = urlEncode(FilenameUtils.getBaseName(filename));
final String extension = FilenameUtils.getExtension(filename);
String tmpFileName = urlEncode(filename);
int i = 2;
while (WebDavHelper.isUrlAccessible(webdavclient, urlBase + tmpFileName)) {
tmpFileName = baseName + urlEncode("(" + i + ")") + "." + extension;
i += 1;
}
return urlBase + tmpFileName;
}
/**
* Encodes a URL with the class URLEncoder and the encoding UTF-8. If the encoding is not supported a standard
* encoding will be used.
*
* @param string DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private String urlEncode(String string) {
try {
string = URLEncoder.encode(string, "UTF-8");
} catch (UnsupportedEncodingException ex) {
LOG.error("The encoding UTF-8 is not supported, use standard encoding instead.", ex);
string = URLEncoder.encode(string);
}
return string.replace("+", "%20");
}
/**
* DOCUMENT ME!
*
* @param path DOCUMENT ME!
* @param information DOCUMENT ME!
*/
private void saveContent(final Path path, final ContentInformation information) {
try {
information.content = IOUtils.toString(Files.newBufferedReader(path, Charset.defaultCharset()));
information.contentLocation = null;
} catch (IOException ex) {
LOG.error("Could not read content of:" + path, ex); // NOI18N
information.content = ""; // NOI18N
}
}
/**
* DOCUMENT ME!
*
* @param webdavclient DOCUMENT ME!
* @param urlBase DOCUMENT ME!
*/
private void checkAndCreateFolder(final WebDavClient webdavclient, final String urlBase) {
if (!WebDavHelper.isUrlAccessible(webdavclient, urlBase)) {
try {
webdavclient.mkCol(urlBase);
} catch (IOException ex) {
LOG.error(ex, ex);
}
}
}
/**
* DOCUMENT ME!
*/
private void setFunctionAndProtocolForRepresentation() {
if ("representation".equalsIgnoreCase(cidsBean.getClass().getSimpleName())) {
final String contentLocation = (String)cidsBean.getProperty("contentlocation");
if (contentLocation == null) {
try {
// content is set
cidsBean.setProperty("function", null);
cidsBean.setProperty("protocol", null);
} catch (Exception ex) {
LOG.error(ex, ex);
}
} else {
try {
// content is set
cidsBean.setProperty("function", functionCidsBean);
cidsBean.setProperty("protocol", protocolCidsBean);
} catch (Exception ex) {
LOG.error(ex, ex);
}
}
}
}
/**
* DOCUMENT ME!
*/
private synchronized void fetchFunctionAndProtocolTags() {
if (functionCidsBean == null) {
functionCidsBean = TagUtils.fetchTagByName("download");
}
if (protocolCidsBean == null) {
protocolCidsBean = TagUtils.fetchTagByName("WWW:DOWNLOAD-1.0-http--download");
}
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class UploadNotSuccessfullException extends Exception {
//~ Instance fields ----------------------------------------------------
int responseCode;
//~ Constructors -------------------------------------------------------
/**
* Creates a new UploadNotSuccessfullException object.
*
* @param responseCode DOCUMENT ME!
* @param message DOCUMENT ME!
*/
public UploadNotSuccessfullException(final int responseCode, final String message) {
super(message);
this.responseCode = responseCode;
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
public class ProcessInformation {
//~ Instance fields ----------------------------------------------------
String message;
int processInPercent;
//~ Constructors -------------------------------------------------------
/**
* Creates a new ProcessInformation object.
*
* @param message DOCUMENT ME!
* @param processInPercent DOCUMENT ME!
*/
public ProcessInformation(final String message, final int processInPercent) {
this.message = message;
this.processInPercent = processInPercent;
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
public class ContentInformation {
//~ Instance fields ----------------------------------------------------
public CidsBean contentType;
public String content;
public String contentLocation;
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class FileDropListener implements DropTargetListener {
//~ Methods ------------------------------------------------------------
@Override
public void dragEnter(final DropTargetDragEvent dtde) {
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else {
dtde.rejectDrag();
}
}
@Override
public void dragOver(final DropTargetDragEvent dtde) {
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else {
dtde.rejectDrag();
}
}
@Override
public void dropActionChanged(final DropTargetDragEvent dtde) {
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else {
dtde.rejectDrag();
}
}
@Override
public void dragExit(final DropTargetEvent dte) {
// noop
}
@Override
public void drop(final DropTargetDropEvent dtde) {
try {
if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)) {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
final File file;
if (dtde.isDataFlavorSupported(DnDUtils.URI_LIST_FLAVOR)) {
// unix drop
final String uriList = (String)dtde.getTransferable().getTransferData(DnDUtils.URI_LIST_FLAVOR);
final String[] uris = uriList.split(System.getProperty("line.separator")); // NOI18N
if (uris.length >= 1) {
file = new File(new URI(uris[0].trim())); // NOI18N
dtde.dropComplete(true);
} else {
file = null;
dtde.dropComplete(false);
}
} else {
// win drop
@SuppressWarnings("unchecked")
final List<File> data = (List)dtde.getTransferable()
.getTransferData(DataFlavor.javaFileListFlavor);
if (data.size() == 1) {
file = data.get(0);
dtde.dropComplete(true);
} else {
file = null;
dtde.dropComplete(false);
}
}
if (file != null) {
final String path = file.getPath();
txtLocation.setText(path);
}
} else {
dtde.rejectDrop();
}
} catch (final Exception e) {
if (LOG.isDebugEnabled()) {
LOG.debug("reject drop: " + dtde, e); // NOI18N
}
dtde.dropComplete(false);
}
}
}
}