package net.brutex.xservices.ws.rs; import java.io.File; import java.util.ArrayList; 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 org.apache.commons.configuration.ConfigurationException; import org.apache.jcs.JCS; import org.apache.jcs.access.exception.CacheException; 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.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.RlogCommand; import org.netbeans.lib.cvsclient.connection.AuthenticationException; 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); public Response getRepositoryFiles(HttpHeaders h, File f, String modules, boolean showRevisions, boolean forceNoCache) { final List list = new ArrayList(); String cachekey = "getFiles" + f.toURI().toString(); logger.debug("forceNoCache="+forceNoCache); List cacheresult = (List) 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; 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); } }); 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(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(); } } // prepare output after everything is cached if (!showRevisions) { for (FileType t : list) { t.clearRevisionList(); } } GenericEntity entity = new GenericEntity>(list) {}; return Response.ok(entity).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(); } // ------------------------- try { CVSClient cvsclient = new CVSClient(f); Client client = cvsclient.client; final List list = new ArrayList(); 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())); } }); CheckoutCommand co = new CheckoutCommand(); co.setShowModulesWithStatus(true); 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("","","","")); } GenericEntity entity = new GenericEntity>(list) { }; getCacheInstance().put(cachekey, list); return Response.ok(entity).build(); } catch (Exception e) { e.printStackTrace(); } return Response.serverError().build(); } /** * Get the caching manager for CVS objects * * @return The CVSCaching JCS region */ public JCS getCacheInstance() { JCS jcs = null; final String cacheinstance = "CVSCache"; try { logger.debug("Getting cache instance named '"+cacheinstance+"'" ); jcs = JCS.getInstance(cacheinstance); } catch (CacheException e) { logger.error("Failed to get cache instance", e); e.printStackTrace(); } return jcs; } }