blob: b63321818001380fd9721730770a79bde5570f69 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.
*
*************************************************************/
/*
* Created on 31.10.2003
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package com.sun.star.wizards.common;
import java.util.List;
import java.util.Vector;
import com.sun.star.beans.Property;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.sdbc.XResultSet;
import com.sun.star.sdbc.XRow;
import com.sun.star.ucb.*;
import com.sun.star.uno.UnoRuntime;
/**
* @author rpiterman
* This class is used to copy the content of a folder to
* another folder.
* There is an incosistency with argument order.
* It should be always: dir,filename.
*/
public class UCB
{
private Object ucb;
private FileAccess fa;
public UCB(XMultiServiceFactory xmsf) throws Exception
{
String[] keys = new String[2];
keys[ 0 ] = "Local";
keys[ 1 ] = "Office";
ucb = xmsf.createInstanceWithArguments(
"com.sun.star.ucb.UniversalContentBroker", keys );
fa = new FileAccess(xmsf);
}
public void deleteDirContent(String dir)
throws Exception
{
if (!fa.exists(dir,true))
{
return;
}
List l = listFiles(dir,null);
for (int i = 0; i<l.size(); i++)
{
delete(FileAccess.connectURLs(dir ,(String)l.get(i)));
}
}
public void delete(String filename) throws Exception
{
//System.out.println("UCB.delete(" + filename);
executeCommand( getContent(filename),"delete",Boolean.TRUE);
}
public void copy(String sourceDir, String targetDir) throws Exception
{
copy(sourceDir,targetDir,(Verifier)null);
}
public void copy(String sourceDir, String targetDir, Verifier verifier) throws Exception
{
List files = listFiles(sourceDir,verifier);
for (int i = 0; i<files.size(); i++)
{
copy(sourceDir, (String)files.get(i), targetDir);
}
}
public void copy(String sourceDir, String filename, String targetDir, String targetName) throws Exception
{
if (!fa.exists(targetDir,true))
{
fa.fileAccess.createFolder(targetDir);
}
//System.out.println("UCB.copy(" + sourceDir + ", " + filename + ", " + targetDir+ ", " + targetName);
executeCommand(ucb, "globalTransfer", copyArg(sourceDir,filename, targetDir,targetName));
}
/**
* @deprecated
* @param sourceDir
* @param filename
* @param targetDir
* @throws Exception
*/
public void copy(String sourceDir, String filename, String targetDir) throws Exception
{
copy(sourceDir,filename, targetDir, PropertyNames.EMPTY_STRING);
}
/**
* target name can be PropertyNames.EMPTY_STRING, in which case the name stays lige the source name
* @param sourceDir
* @param sourceFilename
* @param targetDir
* @param targetFilename
* @return
*/
public GlobalTransferCommandArgument copyArg(String sourceDir, String sourceFilename, String targetDir, String targetFilename)
{
GlobalTransferCommandArgument aArg = new GlobalTransferCommandArgument();
aArg.Operation = TransferCommandOperation.COPY;
aArg.SourceURL = fa.getURL(sourceDir,sourceFilename);
aArg.TargetURL = targetDir;
aArg.NewTitle = targetFilename;
// fail, if object with same name exists in target folder
aArg.NameClash = NameClash.OVERWRITE;
return aArg;
}
public Object executeCommand(Object xContent, String aCommandName, Object aArgument)
throws com.sun.star.ucb.CommandAbortedException,
com.sun.star.uno.Exception
{
XCommandProcessor xCmdProcessor = UnoRuntime.queryInterface(
XCommandProcessor.class, xContent);
Command aCommand = new Command();
aCommand.Name = aCommandName;
aCommand.Handle = -1; // not available
aCommand.Argument = aArgument;
return xCmdProcessor.execute(aCommand, 0, null);
}
public List listFiles(String path, Verifier verifier) throws Exception
{
Object xContent = getContent(path);
OpenCommandArgument2 aArg = new OpenCommandArgument2();
aArg.Mode = OpenMode.ALL;
aArg.Priority = 32768;
// Fill info for the properties wanted.
aArg.Properties = new Property[] {new Property()};
aArg.Properties[0].Name = PropertyNames.PROPERTY_TITLE;
aArg.Properties[0].Handle = -1;
XDynamicResultSet xSet;
xSet = UnoRuntime.queryInterface(
XDynamicResultSet.class,executeCommand(xContent, "open", aArg));
XResultSet xResultSet = xSet.getStaticResultSet();
List files = new Vector();
if (xResultSet.first())
{
// obtain XContentAccess interface for child content access and XRow for properties
XContentAccess xContentAccess = UnoRuntime.queryInterface(
XContentAccess.class, xResultSet);
XRow xRow = UnoRuntime.queryInterface(XRow.class, xResultSet);
do
{
// Obtain URL of child.
String aId = xContentAccess.queryContentIdentifierString();
// First column: Title (column numbers are 1-based!)
String aTitle = xRow.getString(1);
if (aTitle.length() == 0 && xRow.wasNull())
{
//ignore
}
else
{
files.add(aTitle);
}
}
while (xResultSet.next()); // next child
}
if (verifier != null)
{
for (int i = 0; i<files.size(); i++)
{
if (!verifier.verify(files.get(i)))
{
files.remove(i--);
}
}
}
return files;
}
public Object getContentProperty(Object content, String propName, Class type)
throws Exception
{
Property[] pv = new Property[1];
pv[0] = new Property();
pv[0].Name = propName;
pv[0].Handle = -1;
Object row = executeCommand(content,"getPropertyValues",pv);
XRow xrow = UnoRuntime.queryInterface(XRow.class,row);
if (type.equals(String.class))
{
return xrow.getString(1);
}
else if (type.equals(Boolean.class))
{
return xrow.getBoolean(1) ? Boolean.TRUE : Boolean.FALSE;
}
else if (type.equals(Integer.class))
{
return new Integer(xrow.getInt(1));
}
else if (type.equals(Short.class))
{
return new Short(xrow.getShort(1));
}
else
{
return null;
}
}
public Object getContent(String path) throws Exception
{
//System.out.println("Getting Content for : " + path);
XContentIdentifier id = UnoRuntime.queryInterface(XContentIdentifierFactory.class, ucb).createContentIdentifier(path);
return UnoRuntime.queryInterface(
XContentProvider.class,ucb).queryContent(id);
}
public static interface Verifier
{
public boolean verify(Object object);
}
}