/* * Copyright 2010 Brian Rosenberger (Brutex Network) * * Licensed 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 net.brutex.xservices.ws.impl; import java.io.BufferedInputStream; 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.UnsupportedEncodingException; import java.util.Iterator; import java.util.List; import javax.activation.DataHandler; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import net.brutex.xservices.types.AntProperty; import net.brutex.xservices.types.ArchiveResource; import net.brutex.xservices.types.AttachmentType; import net.brutex.xservices.types.FileResource; import net.brutex.xservices.types.FileSetResource; import net.brutex.xservices.types.ReplacePattern; import net.brutex.xservices.types.ResourceInterface; import net.brutex.xservices.types.ReturnCode; import net.brutex.xservices.util.BrutexNamespaces; import net.brutex.xservices.util.RunTask; import net.brutex.xservices.ws.FileService; import net.brutex.xservices.ws.XServicesFault; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64InputStream; import org.apache.cxf.aegis.type.mtom.StreamDataSource; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.taskdefs.Basename; import org.apache.tools.ant.taskdefs.Chmod; import org.apache.tools.ant.taskdefs.Copy; import org.apache.tools.ant.taskdefs.Echo; import org.apache.tools.ant.taskdefs.LoadResource; import org.apache.tools.ant.taskdefs.Replace; import org.apache.tools.ant.taskdefs.optional.ReplaceRegExp; import org.apache.tools.ant.taskdefs.optional.unix.Chgrp; import org.apache.tools.ant.taskdefs.optional.unix.Chown; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.Resource; import org.apache.tools.ant.types.ResourceCollection; /** * * @author Brian Rosenberger, bru@brutex.de */ @WebService(targetNamespace = BrutexNamespaces.WS_XSERVICES, endpointInterface = "net.brutex.xservices.ws.FileService", serviceName = "FileService") public class FileServiceImpl implements FileService { /* * (non-Javadoc) * * @see net.brutex.xservices.ws.impl.FileService#basename(java.lang.String, * java.lang.String) */ @Override @WebMethod(operationName = "basename") public String basename(@WebParam(name = "file") String filename, @WebParam(name = "suffix") String suffix) { final String BASENAME_VALUE = "basename.value"; Basename basename = new Basename(); RunTask runner = new RunTask(basename); basename.setFile(new File(filename)); if (suffix != null && !suffix.equals("")) { basename.setSuffix(suffix); } basename.setProperty("BASENAME_VALUE"); ReturnCode r = runner.postTask(); return r.getProperty("BASENAME_VALUE"); } @WebMethod(operationName = "replaceInFile") public ReturnCode replaceInFile( @WebParam(name = "file") FileResource res, @WebParam(name = "search") String search, @WebParam(name = "replace") String replace) { ReturnCode r = null; Replace rep = new Replace(); rep.setTaskName("Replace"); RunTask runner = new RunTask(rep); rep.addConfigured(res.getAntResource(rep.getProject())); rep.setToken(search); rep.setValue(replace); r = runner.postTask(); return r; } @WebMethod(operationName = "replaceInFile2") public ReturnCode replaceInFile2( @WebParam(name = "file") FileResource res, @WebParam(name = "patternList") List patternList) { ReturnCode r = null; for (ReplacePattern pat : patternList) { Replace rep = new Replace(); rep.setTaskName("Replace"); RunTask runner = new RunTask(rep); rep.addConfigured(res.getAntResource(rep.getProject())); rep.setToken(pat.search); rep.setValue(pat.replace); r = runner.postTask(); } return r; } @WebMethod(operationName = "replaceInFileRegEx") public ReturnCode replaceInFileRegEx( @WebParam(name = "file") FileResource res, @WebParam(name = "search") String search, @WebParam(name = "replace") String replace, @WebParam(name = "flags") String flags) { ReplaceRegExp rep = new ReplaceRegExp(); rep.setTaskName("ReplaceRegExp"); RunTask runner = new RunTask(rep); File infile = new File(res.uri); rep.setFile(infile); rep.setMatch(search); rep.setReplace(replace); rep.setFlags(flags); ReturnCode r = runner.postTask(); return r; } /* * (non-Javadoc) * * @see * net.brutex.xservices.ws.impl.FileService#base64Encode(net.brutex.xservices * .types.FileSetResource) */ @Override @WebMethod(operationName = "downloadFile") public AttachmentType downloadFile(@WebParam(name = "file") FileResource res) { InputStream is = null; try { is = res.getAntResource(null).getInputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } DataHandler h = new DataHandler(new StreamDataSource( "application/binary", is)); AttachmentType t = new AttachmentType(); t.setContent(h); t.setFilename(res.getAntResource(null).getName()); return t; } /* * (non-Javadoc) * * @see * net.brutex.xservices.ws.impl.FileService#base64Decode(net.brutex.xservices * .types.AttachmentType) */ @Override @WebMethod(operationName = "uploadFile") public String uploadFile(@WebParam(name = "file") AttachmentType file) { DataHandler h = file.getContent(); File f = new File(file.getFilename()); FileOutputStream fout; try { fout = new FileOutputStream(f); /* * InputStream in = h.getInputStream(); int b; while( (b=in.read())!= -1 ) { fout.write(b); } */ h.writeTo(fout); fout.flush(); fout.close(); //in.close(); } catch (FileNotFoundException e) { throw new BuildException(e); } catch (IOException e) { throw new BuildException(e); } return file.getFilename(); } /* * (non-Javadoc) * * @see * net.brutex.xservices.ws.impl.FileService#copy(net.brutex.xservices.types * .FileSetResource, java.lang.String, boolean, boolean, java.lang.String) */ @Override @WebMethod(operationName = "copy") public ReturnCode copy(@WebParam(name = "fileset") FileSetResource src, @WebParam(name = "todir") String todir, @WebParam(name = "preservelastmodified") boolean plm, @WebParam(name = "overwrite") boolean overwrite, @WebParam(name = "encoding") String encoding) throws XServicesFault { return copy(src, new File(todir), plm, overwrite, encoding); } @Override public ReturnCode copyFile(String fromFile, String tofile, boolean overwrite) throws XServicesFault { Copy copy = new Copy(); copy.setTaskName("Copy"); RunTask runner = new RunTask(copy); File f = new File(fromFile); if( ! f.isFile() ) throw new XServicesFault("File '"+fromFile+"' not found."); copy.setFile( new File( fromFile )); copy.setTofile(new File(tofile)); copy.setOverwrite(overwrite); return runner.postTask(); } /* * (non-Javadoc) * * @see * net.brutex.xservices.ws.impl.FileService#loadRes(net.brutex.xservices * .types.FileResource, java.lang.String) */ @Override @WebMethod(operationName = "loadResource") public String loadRes(@WebParam(name = "resource") FileResource res, @WebParam(name = "encoding") String encoding) { if (encoding == null || encoding.equals("")) { encoding = System.getProperty("file.encoding"); } LoadResource lr = new LoadResource(); lr.setTaskName("LoadResource"); RunTask runner = new RunTask(lr); lr.addConfigured(res.getAntResource(lr.getProject())); lr.setEncoding(encoding); System.out.println("Using encoding: " + encoding); lr.setProperty("LoadResource.out"); ReturnCode r = runner.postTask(); return r.getProperty("LoadResource.out"); } /* * (non-Javadoc) * * @see * net.brutex.xservices.ws.impl.FileService#loadResFromArchive(net.brutex * .xservices.types.ArchiveResource, java.lang.String) */ @Override @WebMethod(operationName = "loadResourceFromArchive") public String loadResFromArchive( @WebParam(name = "archiveresource") ArchiveResource res, @WebParam(name = "encoding") String encoding) { if (encoding == null || encoding.equals("")) { encoding = System.getProperty("file.encoding"); } LoadResource lr = new LoadResource(); lr.setTaskName("LoadResource"); RunTask runner = new RunTask(lr); lr.addConfigured(res.getAntResource(lr.getProject())); lr.setEncoding(encoding); System.out.println("Using encoding: " + encoding); lr.setProperty("LoadResource.out"); ReturnCode r = runner.postTask(); return r.getProperty("LoadResource.out"); } /* * (non-Javadoc) * * @see net.brutex.xservices.ws.impl.FileService#echo2file(java.lang.String, * java.lang.String, java.lang.String, boolean) */ @Override @WebMethod(operationName = "echoToFile") public ReturnCode echo2file(@WebParam(name = "message") String message, @WebParam(name = "file") String file, @WebParam(name = "encoding") String encoding, @WebParam(name = "append") boolean append) { return echo(message, new File(file), encoding, append); } /* * (non-Javadoc) * * @see * net.brutex.xservices.ws.impl.FileService#changeOwner(net.brutex.xservices * .types.FileSetResource, java.lang.String) */ @Override @WebMethod(operationName = "changeOwner") public ReturnCode changeOwner( @WebParam(name = "fileset") FileSetResource res, @WebParam(name = "owner") String owner) { return chown(res, owner); } /* * (non-Javadoc) * * @see * net.brutex.xservices.ws.impl.FileService#changeGroup(net.brutex.xservices * .types.FileSetResource, java.lang.String) */ @Override @WebMethod(operationName = "changeGroup") public ReturnCode changeGroup( @WebParam(name = "fileset") FileSetResource res, @WebParam(name = "group") String group) { return chgrp(res, group); } /* * (non-Javadoc) * * @see * net.brutex.xservices.ws.impl.FileService#changeMode(net.brutex.xservices * .types.FileSetResource, java.lang.String) */ @Override @WebMethod(operationName = "changeMode") public ReturnCode changeMode( @WebParam(name = "fileset") FileSetResource res, @WebParam(name = "permissions") String perm) { return chmod(res, perm); } @WebMethod(exclude = true) private ReturnCode echo(String msg, File file, String encoding, boolean append) { Echo echo = new Echo(); echo.setTaskName("toFile"); RunTask runTask = new RunTask(echo); echo.addText(msg); echo.setEncoding(encoding); echo.setFile(file); echo.setAppend(append); return runTask.postTask(); } @WebMethod(exclude = true) private ReturnCode copy(FileSetResource src, File dst, boolean preservelastmodified, boolean overwrite, String encoding) { Copy copy = new Copy(); copy.setTaskName("Copy"); RunTask runner = new RunTask(copy); FileSet set = src.getAntResource(copy.getProject()); copy.add(set); if (dst.isDirectory()) { copy.setTodir(dst); } if (dst.isFile()) { copy.setTofile(dst); } copy.setOverwrite(overwrite); copy.setPreserveLastModified(preservelastmodified); if (encoding != null && !encoding.equals("")) { copy.setOutputEncoding(encoding); } else { copy.setOutputEncoding(System.getProperty("file.encoding")); } return runner.postTask(); } @WebMethod(exclude = true) private ReturnCode chown(FileSetResource src, String owner) { Chown chown = new Chown(); chown.setTaskName("Chown"); RunTask runner = new RunTask(chown); chown.setOwner(owner); FileSet set = src.getAntResource(chown.getProject()); chown.add(set); chown.setMaxParallel(300); return runner.postTask(); } @WebMethod(exclude = true) private ReturnCode chgrp(FileSetResource src, String group) { Chgrp chgrp = new Chgrp(); chgrp.setTaskName("Chgrp"); RunTask runner = new RunTask(chgrp); chgrp.setGroup(group); FileSet set = src.getAntResource(chgrp.getProject()); chgrp.add(set); chgrp.setMaxParallel(300); return runner.postTask(); } @WebMethod(exclude = true) private ReturnCode chmod(FileSetResource src, String perm) { Chmod chmod = new Chmod(); chmod.setTaskName("Chmod"); RunTask runner = new RunTask(chmod); FileSet set = src.getAntResource(chmod.getProject()); chmod.add(set); chmod.setMaxParallel(300); chmod.setPerm(perm); chmod.setVerbose(true); return runner.postTask(); } }