From 5f3b81ebfde95fcb394234b1e5e540e12644238a Mon Sep 17 00:00:00 2001 From: Brian Rosenberger Date: Tue, 5 Feb 2013 14:34:01 +0000 Subject: [PATCH] git-svn-id: https://brutex.net/svn/xservices/trunk@109 e7e49efb-446e-492e-b9ec-fcafc1997a86 --- .../net/brutex/xservices/ws/rs/CVSInfo.java | 80 ++- .../brutex/xservices/ws/rs/CVSInfoImpl.java | 454 ++++++++++++------ .../net/brutex/xservices/ws/rs/FileInfo.java | 55 +-- .../brutex/xservices/ws/rs/FileInfoImpl.java | 155 +++--- .../brutex/xservices/ws/rs/FileListType.java | 23 +- .../brutex/xservices/ws/rs/ResultType.java | 18 + 6 files changed, 442 insertions(+), 343 deletions(-) create mode 100644 src/java/net/brutex/xservices/ws/rs/ResultType.java diff --git a/src/java/net/brutex/xservices/ws/rs/CVSInfo.java b/src/java/net/brutex/xservices/ws/rs/CVSInfo.java index 94acac8..801e4ab 100644 --- a/src/java/net/brutex/xservices/ws/rs/CVSInfo.java +++ b/src/java/net/brutex/xservices/ws/rs/CVSInfo.java @@ -1,69 +1,47 @@ -/* - * Copyright 2012 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.rs; import java.io.File; -import java.util.List; - import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.Path; -import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import net.brutex.xservices.types.FileInfoType; - - - @Path("/CVSService/") -@Produces ({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) -public interface CVSInfo { +@Produces({"application/xml", "application/json"}) +public abstract interface CVSInfo +{ + public static final String WS_OPERATION_GETREPOSITORYFILES = "getRepositoryFiles"; + public static final String WS_OPERATION_GETMODULES = "getModules"; + public static final String WS_OPERATION_GETTAGS = "getTags"; + public static final String WS_OPERATION_GETFILECONTENT = "getFileContent"; + public static final String WS_OPERATION_SEARCHFILECONTENT = "searchFileContent"; -/** - * @param module - * @param withDir - * @param withFiles - * @param depth - * @param search - * @param count - * @param page - * @return List of File - */ -@GET -@Path("getRepositoryFiles/") -public Response getRepositoryFiles(@Context HttpHeaders h, - @QueryParam("config") File f, - @QueryParam("modules") @DefaultValue("") String modules, - @QueryParam("showRevisions") @DefaultValue("false") boolean showRevisions, - @QueryParam("forceNoCache") @DefaultValue("false") boolean forceNoCache - ); + @GET + @Path("getRepositoryFiles") + public abstract Response getRepositoryFiles(@Context HttpHeaders paramHttpHeaders, @QueryParam("config") File paramFile, @QueryParam("modules") @DefaultValue("") String paramString, @QueryParam("recursive") @DefaultValue("false") boolean paramBoolean1, @QueryParam("showRevisions") @DefaultValue("false") boolean paramBoolean2, @QueryParam("forceNoCache") @DefaultValue("false") boolean paramBoolean3); -@GET -@Path("getModules") -public Response getModules(@Context HttpHeaders h, - @QueryParam("config") File f, - @QueryParam("forceNoCache") @DefaultValue("false") boolean forceNoCache); + @GET + @Path("getModules") + public abstract Response getModules(@Context HttpHeaders paramHttpHeaders, @QueryParam("config") File paramFile, @QueryParam("forceNoCache") @DefaultValue("false") boolean paramBoolean); + @GET + @Path("getTags") + public abstract Response getTags(@Context HttpHeaders paramHttpHeaders, @QueryParam("config") File paramFile, @QueryParam("withFiles") @DefaultValue("false") boolean paramBoolean); + + @GET + @Path("getFileContent") + public abstract Response getFileContent(@Context HttpHeaders paramHttpHeaders, @QueryParam("config") File paramFile, @QueryParam("file") String paramString, @QueryParam("forceNoCache") @DefaultValue("false") boolean paramBoolean); + + @GET + @Path("searchFileContent") + public abstract Response searchFileContent(@Context HttpHeaders paramHttpHeaders, @QueryParam("config") File paramFile, @QueryParam("file_regexp") String paramString1, @QueryParam("content_regexp") String paramString2, @QueryParam("forceNoCache") @DefaultValue("false") boolean paramBoolean); } - - +/* Location: C:\Users\brosenberger\Documents\My Box Files\XBridgeNG-download\XServices-20130131 - Kopie\WEB-INF\classes\net.zip + * Qualified Name: net.brutex.xservices.ws.rs.CVSInfo + * JD-Core Version: 0.6.2 + */ \ No newline at end of file diff --git a/src/java/net/brutex/xservices/ws/rs/CVSInfoImpl.java b/src/java/net/brutex/xservices/ws/rs/CVSInfoImpl.java index b062d2c..a4fc6dd 100644 --- a/src/java/net/brutex/xservices/ws/rs/CVSInfoImpl.java +++ b/src/java/net/brutex/xservices/ws/rs/CVSInfoImpl.java @@ -1,14 +1,28 @@ package net.brutex.xservices.ws.rs; +import java.io.ByteArrayOutputStream; import java.io.File; -import java.util.ArrayList; +import java.io.FileReader; +import java.io.IOException; +import java.io.PrintStream; +import java.net.URI; import java.util.List; import java.util.StringTokenizer; - -import javax.ws.rs.core.GenericEntity; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; - +import javax.ws.rs.core.Response.ResponseBuilder; +import net.brutex.xservices.types.scm.AttributeType; +import net.brutex.xservices.types.scm.ItemListType; +import net.brutex.xservices.types.scm.ItemType; +import net.brutex.xservices.types.scm.ModuleListType; +import net.brutex.xservices.types.scm.ModuleType; +import net.brutex.xservices.types.scm.ObjectFactory; +import net.brutex.xservices.types.scm.RevisionType; +import net.brutex.xservices.types.scm.TagListType; +import net.brutex.xservices.types.scmfindings.FindingsListType; +import net.brutex.xservices.util.BasicCVSListener; +import net.brutex.xservices.util.CVSClient; +import net.brutex.xservices.util.CVSRoot; import org.apache.commons.configuration.ConfigurationException; import org.apache.jcs.JCS; import org.apache.jcs.access.exception.CacheException; @@ -16,210 +30,348 @@ import org.apache.log4j.Logger; import org.netbeans.lib.cvsclient.Client; import org.netbeans.lib.cvsclient.command.CommandAbortedException; import org.netbeans.lib.cvsclient.command.CommandException; +import org.netbeans.lib.cvsclient.command.FileInfoContainer; +import org.netbeans.lib.cvsclient.command.PipedFileInformation; import org.netbeans.lib.cvsclient.command.checkout.CheckoutCommand; import org.netbeans.lib.cvsclient.command.checkout.ModuleListInformation; import org.netbeans.lib.cvsclient.command.log.LogInformation; +import org.netbeans.lib.cvsclient.command.log.LogInformation.Revision; import org.netbeans.lib.cvsclient.command.log.RlogCommand; import org.netbeans.lib.cvsclient.connection.AuthenticationException; +import org.netbeans.lib.cvsclient.event.EventManager; import org.netbeans.lib.cvsclient.event.FileInfoEvent; -import net.brutex.xservices.types.scm.ModuleType; -import net.brutex.xservices.types.scm.FileType; -import net.brutex.xservices.types.scm.Revision; -import net.brutex.xservices.util.BasicCVSListener; -import net.brutex.xservices.util.CVSClient; - -/** - * @author Brian Rosenberger - * @since 0.5.0-20120824 - * - */ public class CVSInfoImpl implements CVSInfo { - final Logger logger = Logger.getLogger(CVSInfoImpl.class); + final ObjectFactory FACTORY = new ObjectFactory(); + final ItemListType list = this.FACTORY.createItemListType(); public Response getRepositoryFiles(HttpHeaders h, File f, String modules, - boolean showRevisions, - boolean forceNoCache) { - - final List list = new ArrayList(); - + boolean isRecursive, boolean showRevisions, boolean forceNoCache) { String cachekey = "getFiles" + f.toURI().toString(); - logger.debug("forceNoCache="+forceNoCache); - List cacheresult = (List) getCacheInstance().get( + this.logger.debug("forceNoCache=" + forceNoCache); + ItemListType cacheresult = (ItemListType) getCacheInstance().get( cachekey); - if (!forceNoCache && cacheresult != null) { - // Cache hit - list.addAll(cacheresult); - } else { - // Cache miss - try { - CVSClient cvsclient = new CVSClient(f); - Client client = cvsclient.client; + if ((!forceNoCache) && (cacheresult != null)) { + return Response.ok(cacheresult).build(); + } + Client client; + try { + final CVSClient cvsclient = new CVSClient(f); + client = cvsclient.client; - client.getEventManager().addCVSListener(new BasicCVSListener() { - @Override - public void fileInfoGenerated(FileInfoEvent arg0) { - LogInformation info = (LogInformation) arg0 - .getInfoContainer(); - FileType cvsfile = new FileType(info.getFile(), info - .getRepositoryFilename(), info.getDescription()); - cvsfile.setHeadRevision(info.getHeadRevision()); - cvsfile.setBranch(info.getBranch()); - cvsfile.setTotalRevisions(info.getTotalRevisions()); - for (LogInformation.Revision r : info.getRevisionList()) { - cvsfile.addRevision(new Revision(r.getNumber(), r - .getMessage())); - } - list.add(cvsfile); + client.getEventManager().addCVSListener(new BasicCVSListener() { + public void fileInfoGenerated(FileInfoEvent arg0) { + LogInformation info = (LogInformation) arg0 + .getInfoContainer(); + String repoPath = cvsclient.client.getRepository(); + + ItemType cvsfile = CVSInfoImpl.this.FACTORY + .createItemType(); + cvsfile.setIsLeaf(true); + cvsfile.setIsBinary(false); + + cvsfile.setFullname(info.getRepositoryFilename().substring( + repoPath.length() + 2, + info.getRepositoryFilename().length() - 2)); + + cvsfile.setRemotename(info.getRepositoryFilename()); + cvsfile.setRemotefullname(info.getRepositoryFilename()); + RevisionType revision = CVSInfoImpl.this.FACTORY + .createRevisionType(); + revision.setRevision(info.getHeadRevision()); + revision.setComment(info.getDescription()); + cvsfile.setTipRevision(revision); + + for (LogInformation.Revision r : info.getRevisionList()) { + revision = CVSInfoImpl.this.FACTORY + .createRevisionType(); + revision.setRevision(r.getNumber()); + revision.setComment(r.getMessage()); + cvsfile.getRevisions().add(revision); } - }); - RlogCommand rlog = new RlogCommand(); - StringTokenizer tk = new StringTokenizer(modules, ","); - while (tk.hasMoreTokens()) { - rlog.setModule(tk.nextToken()); + cvsfile.getAttributes().add( + CVSInfoImpl.this.getAttribute("TOTALREVISIONS", + info.getTotalRevisions())); + cvsfile.getAttributes().add( + CVSInfoImpl.this.getAttribute("BRANCH", + info.getBranch())); + cvsfile.getAttributes().add( + CVSInfoImpl.this.getAttribute( + "KEYWORDSUBSTITUTION", + info.getKeywordSubstitution())); + cvsfile.getAttributes().add( + CVSInfoImpl.this.getAttribute("LOCKS", + info.getLocks())); + cvsfile.getAttributes().add( + CVSInfoImpl.this.getAttribute("SELECTEDREVISIONS", + info.getSelectedRevisions())); + cvsfile.setROOT(cvsclient.getRoot().host + "@" + + cvsclient.getRoot().repository); + + CVSInfoImpl.this.list.getItems().add(cvsfile); + + String key = CVSClient.generateID(cvsfile); + try { + CVSInfoImpl.this.getCacheInstance().put(key, cvsfile); + } catch (CacheException e) { + CVSInfoImpl.this.logger.error("Could not cache item '" + + key + "'", e); + } } - if (rlog.getModules().length == 0) - rlog.setModule(""); - - rlog.setDefaultBranch(true); // -b Print information about the - // revisions on the default - // branch, - // normally the highest branch - // on - // the trunk. - rlog.setNoTags(true); // -N Do not print the list of tags for - // this - // file. This option can be very useful - // when - // your site uses a lot of tags, so - // rather - // than "more"'ing over 3 pages of tag - // information, the log information is - // presented without tags at all. - rlog.setHeaderAndDescOnly(false); // -t Print only the name of - // the - // rcs file, name of the - // file in - // the working directory, - // head, - // default branch, access - // list, - // locks, symbolic names, - // and - // suffix. + description - // rlog.setRevisionFilter("1.1."); - // rlog.setSuppressHeader(true); // -S Supress log output when - // no - // revisions are selected within a file. - client.executeCommand(rlog, cvsclient.getGlobalOptions()); - logger.info("Execute CVS command '" + rlog.getCVSCommand() + "' against '"+cvsclient.getRoot().host+"@" + cvsclient.getRoot().repository+"'"); - //need to put a new list into cache as we will filter the result - //afterwards - getCacheInstance().put(cachekey, new ArrayList(list)); - - - } catch (ConfigurationException e) { - logger.error("CVS Configuration File '" - + f.getAbsolutePath() + f.getName() + "'not found.", e); - - } catch (CommandAbortedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (AuthenticationException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (CommandException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (CacheException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + }); + RlogCommand rlog = new RlogCommand(); + StringTokenizer tk = new StringTokenizer(modules, ","); + while (tk.hasMoreTokens()) { + rlog.setModule(tk.nextToken()); } + if (rlog.getModules().length == 0) { + rlog.setModule(""); + } + rlog.setDefaultBranch(false); + rlog.setNoTags(false); + + rlog.setHeaderAndDescOnly(false); + + rlog.setRecursive(isRecursive); + + this.logger.info("Executing CVS command '" + rlog.getCVSCommand() + + "' against '" + cvsclient.getRoot().host + "@" + + cvsclient.getRoot().repository + "'"); + client.executeCommand(rlog, cvsclient.getGlobalOptions()); + + getCacheInstance().put(cachekey, this.list); + } catch (ConfigurationException e) { + this.logger.error("CVS Configuration File '" + f.getAbsolutePath() + + f.getName() + "'not found.", e); + } catch (CommandAbortedException e) { + e.printStackTrace(); + } catch (AuthenticationException e) { + e.printStackTrace(); + } catch (CommandException e) { + e.printStackTrace(); + } catch (CacheException e) { + e.printStackTrace(); } - - - // prepare output after everything is cached + if (!showRevisions) { - for (FileType t : list) { - t.clearRevisionList(); + for (ItemType t : this.list.getItems()) { + t.getRevisions().clear(); } } - - GenericEntity entity = new GenericEntity>(list) {}; - return Response.ok(entity).build(); + + return Response.ok(this.list).build(); } - @Override public Response getModules(HttpHeaders h, File f, boolean forceNoCache) { - - // Try to deliver from Cache String cachekey = "Modules" + f.toURI().toString(); - logger.debug("forceNoCache="+forceNoCache); - List response = (List) getCacheInstance().get( - cachekey); - if (!forceNoCache && response != null) { - GenericEntity entity = new GenericEntity>(response) { - }; - return Response.ok(entity).build(); - } - // ------------------------- + this.logger.debug("forceNoCache=" + forceNoCache); + ModuleListType response = (ModuleListType) getCacheInstance().get( + cachekey); + if ((!forceNoCache) && (response != null)) { + return Response.ok(response).build(); + } try { CVSClient cvsclient = new CVSClient(f); Client client = cvsclient.client; - - final List list = new ArrayList(); + final ModuleListType list = this.FACTORY.createModuleListType(); client.getEventManager().addCVSListener(new BasicCVSListener() { public void fileInfoGenerated(FileInfoEvent e) { ModuleListInformation info = (ModuleListInformation) e .getInfoContainer(); - - list.add(new ModuleType(info.getModuleName(), info - .getModuleStatus(), info.getPaths(), info.getType())); + ModuleType module = CVSInfoImpl.this.FACTORY + .createModuleType(); + module.setName(info.getModuleName()); + module.setStatus(info.getModuleStatus()); + module.setPath(info.getPaths()); + module.setType(info.getType()); + list.getModules().add(module); } }); - CheckoutCommand co = new CheckoutCommand(); co.setShowModulesWithStatus(true); + this.logger.info("Executing CVS command '" + co.getCVSCommand() + + "' against '" + cvsclient.getRoot().host + "@" + + cvsclient.getRoot().repository + "'"); client.executeCommand(co, cvsclient.getGlobalOptions()); - logger.info("Execute CVS command '" + co.getCVSCommand() + "' against '"+cvsclient.getRoot().host+"@" + cvsclient.getRoot().repository+"'"); - if(list.size()==0) { - logger.warn("Repository '" + cvsclient.getRoot().repository + "' does not have modules"); - list.add(new ModuleType("","","","")); + if (list.getModules().size() == 0) { + this.logger.warn("Repository '" + + cvsclient.getRoot().repository + + "' does not have modules"); } - - GenericEntity entity = new GenericEntity>(list) { - }; + getCacheInstance().put(cachekey, list); - return Response.ok(entity).build(); + return Response.ok(list).build(); } catch (Exception e) { e.printStackTrace(); } return Response.serverError().build(); } - /** - * Get the caching manager for CVS objects - * - * @return The CVSCaching JCS region - */ + public Response getTags(HttpHeaders h, File f, boolean withFiles) { + String cachekey = f.toURI().toString() + ":taglist"; + this.logger.debug("Retrieving Tags from cache using key '" + cachekey + + "'"); + TagListType tags = (TagListType) getCacheInstance().get(cachekey); + if (tags != null) { + this.logger.debug("Delivering Tags from cache."); + return Response.ok(tags).build(); + } + this.logger.warn("Taglist not found in cache."); + return Response.noContent().build(); + } + + public Response getFileContent(HttpHeaders h, File f, String filestring, + boolean forceNoCache) { + final ItemType result = this.FACTORY.createItemType(); + final String cachekey = f.toURI().toString() + ":" + filestring + + ":content"; + ItemListType list = null; + + if (!forceNoCache) { + this.logger.debug("Retrieving file content from cache using key '" + + cachekey + "'"); + list = (ItemListType) getCacheInstance().get(cachekey); + } + + if (list != null) { + this.logger.debug("Delivering file content from cache."); + return Response.ok(list).build(); + } + + this.logger.warn("File content not found in cache."); + list = this.FACTORY.createItemListType(); + try { + CVSClient cvsclient = new CVSClient(f); + Client client = cvsclient.getClient(); + + CheckoutCommand checkout = new CheckoutCommand(); + BasicCVSListener listener = new BasicCVSListener() { + public void fileInfoGenerated(FileInfoEvent arg0) { + System.out.println(arg0.getInfoContainer().getFile() + .toURI().toString()); + PipedFileInformation info = (PipedFileInformation) arg0 + .getInfoContainer(); + result.setName(info.getFile().getName()); + try { + boolean isBinary = false; + result.setIsBinary(isBinary); + result.setRemotename(info.getRepositoryFileName()); + RevisionType revision = CVSInfoImpl.this.FACTORY + .createRevisionType(); + revision.setRevision(info.getRepositoryRevision()); + revision.setComment(""); + + if (!isBinary) { + FileReader fin = new FileReader(info.getTempFile()); + + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + StringBuffer sbuf = new StringBuffer(); + int c; + while ((c = fin.read()) != -1) { + bout.write(c); + sbuf.append((char) c); + } + result.setData(bout.toByteArray()); + result.setContent(sbuf.toString()); + } + + } catch (IOException e2) { + e2.printStackTrace(); + } catch (NullPointerException ne) { + ne.printStackTrace(); + } + + String key = CVSClient.generateID(result); + try { + CVSInfoImpl.this.getCacheInstance().put(cachekey, + result); + } catch (CacheException e1) { + e1.printStackTrace(); + } + } + }; + client.getEventManager().addCVSListener(listener); + + checkout.setModule(filestring); + checkout.setPipeToOutput(true); + + this.logger.info("Execute CVS command '" + checkout.getCVSCommand() + + "' against '" + cvsclient.getRoot().host + "@" + + cvsclient.getRoot().repository + "'"); + client.executeCommand(checkout, cvsclient.getGlobalOptions()); + } catch (CommandAbortedException e) { + e.printStackTrace(); + } catch (ConfigurationException e) { + e.printStackTrace(); + } catch (AuthenticationException e) { + e.printStackTrace(); + } catch (CommandException e) { + e.printStackTrace(); + } + + if (result.getContent() != null) { + return Response.ok(result).build(); + } + return Response.noContent().build(); + } + public JCS getCacheInstance() { JCS jcs = null; - final String cacheinstance = "CVSCache"; + String cacheinstance = "CVSCache"; try { - logger.debug("Getting cache instance named '"+cacheinstance+"'" ); - jcs = JCS.getInstance(cacheinstance); + this.logger.trace("Getting cache instance named 'CVSCache'"); + jcs = JCS.getInstance("CVSCache"); } catch (CacheException e) { - logger.error("Failed to get cache instance", e); + this.logger.error("Failed to get cache instance", e); e.printStackTrace(); } return jcs; } -} + public Response searchFileContent(HttpHeaders h, File f, + String file_regexp, String content_regexp, boolean forceNoCache) { + try { + CVSClient client = new CVSClient(f); + String cvsroot = client.getRoot().host + "@" + + client.getRoot().repository; + + String cachestring = "FINDINGS-" + cvsroot; + this.logger + .debug("Fetch searchFileContent response from cache using cachekey '" + + cachestring + "'"); + FindingsListType result = (FindingsListType) getCacheInstance() + .get(cachestring); + if (result != null) + this.logger.debug("Found object for key '" + cachestring + + "' in cache."); + else { + this.logger.debug("Found no object for key '" + cachestring + + "' in cache."); + } + + if (result != null) + return Response.ok(result).build(); + } catch (CommandAbortedException e) { + e.printStackTrace(); + } catch (ConfigurationException e) { + e.printStackTrace(); + } catch (AuthenticationException e) { + e.printStackTrace(); + } + return Response.noContent().build(); + } + + private AttributeType getAttribute(String name, String value) { + AttributeType attribute = this.FACTORY.createAttributeType(); + attribute.setName(name); + attribute.setValue(value); + return attribute; + } +} \ No newline at end of file diff --git a/src/java/net/brutex/xservices/ws/rs/FileInfo.java b/src/java/net/brutex/xservices/ws/rs/FileInfo.java index ce7c111..2720f32 100644 --- a/src/java/net/brutex/xservices/ws/rs/FileInfo.java +++ b/src/java/net/brutex/xservices/ws/rs/FileInfo.java @@ -1,63 +1,20 @@ -/* - * Copyright 2012 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.rs; -import java.util.List; - import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.Path; -import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; -import net.brutex.xservices.types.FileInfoType; - - - @Path("/FileService/") -@Produces ("application/xml") -public interface FileInfo { - -/** - * @param dir - * @param withDir - * @param withFiles - * @param depth - * @param search - * @param count - * @param page - * @return List of File - */ -@GET -@Path("getFiles/") -public Response getFiles(@Context HttpHeaders h, - @QueryParam("directory") String dir, - @QueryParam("includeDirectories") @DefaultValue("0") boolean withDir, - @QueryParam("includeFiles") @DefaultValue("1") boolean withFiles, - @QueryParam("depth") @DefaultValue("1") int depth, - @QueryParam("search") String search, - @QueryParam("itemsPerPage") @DefaultValue("50") int count, - @QueryParam("page") @DefaultValue("1") int page); - +@Produces({"application/xml"}) +public abstract interface FileInfo +{ + @GET + @Path("getFiles/") + public abstract Response getFiles(@Context HttpHeaders paramHttpHeaders, @QueryParam("directory") String paramString1, @QueryParam("includeDirectories") @DefaultValue("0") boolean paramBoolean1, @QueryParam("includeFiles") @DefaultValue("1") boolean paramBoolean2, @QueryParam("depth") @DefaultValue("1") int paramInt1, @QueryParam("search") String paramString2, @QueryParam("itemsPerPage") @DefaultValue("50") int paramInt2, @QueryParam("page") @DefaultValue("1") int paramInt3); } - - diff --git a/src/java/net/brutex/xservices/ws/rs/FileInfoImpl.java b/src/java/net/brutex/xservices/ws/rs/FileInfoImpl.java index 18079f9..6e2fe48 100644 --- a/src/java/net/brutex/xservices/ws/rs/FileInfoImpl.java +++ b/src/java/net/brutex/xservices/ws/rs/FileInfoImpl.java @@ -2,103 +2,94 @@ package net.brutex.xservices.ws.rs; import java.io.File; import java.io.FileFilter; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; - import javax.ws.rs.core.GenericEntity; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; - -import org.apache.jcs.JCS; -import org.apache.jcs.access.exception.CacheException; - import net.brutex.xservices.security.StandardSecurityManager; import net.brutex.xservices.security.UserIdentity; import net.brutex.xservices.types.FileInfoType; +import org.apache.jcs.JCS; +import org.apache.jcs.access.exception.CacheException; + /** - * @author Brian Rosenberger + * @author Brian Rosenberger, bru(at)brutex.de * */ -public class FileInfoImpl implements FileInfo { +public class FileInfoImpl implements FileInfo +{ + public Response getFiles(HttpHeaders h, String dir, boolean withDir, boolean withFiles, int level, String search, int count, int page) + { + StandardSecurityManager sec = new StandardSecurityManager(); + UserIdentity id = new UserIdentity(); - public Response getFiles(HttpHeaders h, String dir, boolean withDir, - boolean withFiles, int level, String search, int count, int page) { - - StandardSecurityManager sec = new StandardSecurityManager(); - UserIdentity id = new UserIdentity(); + if (!sec.canExecute(java.lang.Thread.currentThread().getStackTrace()[1].getMethodName(), id)) { + return null; + } - - if( ! sec.canExecute(Thread.currentThread().getStackTrace()[1].getMethodName(), id)) { - return null; - } + System.out.println("Listing directory: " + dir); + if (level <= 0) level = 1; + if (level > 3) level = 3; + if ((!withDir) && (!withFiles)) withFiles = true; + String cachekey = level + "||" + withFiles + "||" + withDir + "||" + search + "||" + dir; + try { + JCS jcs = JCS.getInstance("FileCache"); - - System.out.println("Listing directory: " + dir); - if(level <= 0) level = 1; - if(level > 3) level = 3; - if(!withDir && !withFiles) withFiles = true; - String cachekey = level +"||"+ withFiles +"||"+ withDir +"||" + search + "||" + dir; - try { - JCS jcs = JCS.getInstance("FileCache"); - - List list = (List) jcs.get(cachekey); - if(list == null) { - list = setDirectory(dir, withDir, withFiles, level, search); - jcs.put(cachekey, list); - System.out.println("Stored in Cache: " + list.toString()); - } else { - System.out.println("Got from Cache: " + list.toString()); - } + List list = (List)jcs.get(cachekey); + if (list == null) { + list = setDirectory(dir, withDir, withFiles, level, search); + jcs.put(cachekey, list); + System.out.println("Stored in Cache: " + list.toString()); + } else { + System.out.println("Got from Cache: " + list.toString()); + } - - int fromIndex = 0; - int toIndex = 0; - fromIndex = (page-1) * count; - toIndex = (page*count); - if(toIndex>list.size()) toIndex = list.size(); - if(fromIndex>toIndex) fromIndex=toIndex; - GenericEntity> sublist = new GenericEntity>(list.subList(fromIndex, toIndex) ){}; - return Response.ok( sublist ).build(); - } catch (CacheException e) { - Response.serverError().build(); - } - return null; - } + int fromIndex = 0; + int toIndex = 0; + fromIndex = (page - 1) * count; + toIndex = page * count; + if (toIndex > list.size()) toIndex = list.size(); + if (fromIndex > toIndex) fromIndex = toIndex; + GenericEntity sublist = new GenericEntity(list.subList(fromIndex, toIndex)) + { + }; + return Response.ok(sublist).build(); + } catch (CacheException e) { + Response.serverError().build(); + } + return null; + } + private void setDirectory(List list, File dir, boolean withDirectories, boolean withFiles, final int depth, final String search) + { + if (depth <= 0) return; - - private void setDirectory(List list, File dir, final boolean withDirectories, final boolean withFiles, final int depth, final String search) { - if(depth <=0) return; - - File[] files = dir.listFiles(new FileFilter() { - - public boolean accept(File pathname) { - if(pathname.isDirectory() && depth > 1) return true; - if(search == null || search.equals("")) return true; - if(!pathname.getAbsolutePath().contains(search)) return false; - return true; - } - }); - if(dir.getParentFile() != null && withDirectories==true) list.add(new FileInfoType(dir.getParentFile())); - if(files==null) return; - - for( File e : files) { - if(e.isDirectory()) setDirectory(list, e, withDirectories, withFiles, depth-1, search); - if( (withDirectories && e.isDirectory()) - || (withFiles && e.isFile()) ) { - list.add(new FileInfoType(e)); - } - } - } - - private List setDirectory(String dir, final boolean withDirectories, final boolean withFiles, int depth, String search) { - List list = new ArrayList(); - setDirectory( list, (new File(dir)), withDirectories, withFiles, depth, search); - return list; - } - - - -} + File[] files = dir.listFiles(new FileFilter() + { + public boolean accept(File pathname) { + if ((pathname.isDirectory()) && (depth > 1)) return true; + if ((search == null) || (search.equals(""))) return true; + if (!pathname.getAbsolutePath().contains(search)) return false; + return true; + } + }); + if ((dir.getParentFile() != null) && (withDirectories)) list.add(new FileInfoType(dir.getParentFile())); + if (files == null) return; + + for (File e : files) { + if (e.isDirectory()) setDirectory(list, e, withDirectories, withFiles, depth - 1, search); + if (((withDirectories) && (e.isDirectory())) || ( + (withFiles) && (e.isFile()))) + list.add(new FileInfoType(e)); + } + } + + private List setDirectory(String dir, boolean withDirectories, boolean withFiles, int depth, String search) + { + List list = new ArrayList(); + setDirectory(list, new File(dir), withDirectories, withFiles, depth, search); + return list; + } +} \ No newline at end of file diff --git a/src/java/net/brutex/xservices/ws/rs/FileListType.java b/src/java/net/brutex/xservices/ws/rs/FileListType.java index b7986e8..c2d6181 100644 --- a/src/java/net/brutex/xservices/ws/rs/FileListType.java +++ b/src/java/net/brutex/xservices/ws/rs/FileListType.java @@ -2,17 +2,20 @@ package net.brutex.xservices.ws.rs; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; @XmlRootElement(name="FileList") -public class FileListType { +public class FileListType +{ - @XmlElement - public String name; - - public FileListType(){}; - public FileListType(String name) { - this.name = name; - } + @XmlElement + public String name; -} + public FileListType() + { + } + + public FileListType(String name) + { + this.name = name; + } +} \ No newline at end of file diff --git a/src/java/net/brutex/xservices/ws/rs/ResultType.java b/src/java/net/brutex/xservices/ws/rs/ResultType.java new file mode 100644 index 0000000..76c8d93 --- /dev/null +++ b/src/java/net/brutex/xservices/ws/rs/ResultType.java @@ -0,0 +1,18 @@ +package net.brutex.xservices.ws.rs; + +import net.brutex.xservices.types.scm.ItemType; + +class ResultType +{ + private ItemType result = null; + + ItemType getResult() + { + return this.result; + } + + void setResult(ItemType result) + { + this.result = result; + } +} \ No newline at end of file