001: package org.drools.resource;
002:
003: import java.io.ByteArrayOutputStream;
004:
005: import org.drools.resource.exception.ResourceAccessDeniedException;
006: import org.drools.resource.exception.ResourceTypeNotSupportedException;
007: import org.drools.resource.exception.ResourceUrlNotFoundException;
008: import org.drools.resource.util.SvnUtil;
009: import org.tmatesoft.svn.core.SVNException;
010:
011: /**
012: * Resource Handler implementation for subversion. Assumes that there is an HTTP
013: * accessible subversion repository with the following structure:
014: *
015: * Base URL - Example: http://localhost/svn/resource-handler Subfolders off the
016: * base URL:
017: * /drls
018: * /dsls
019: * /functions
020: * /rules
021: * /spreadsheets
022: *
023: * Security can be enabled and if it's enabled, you will need to have
024: * appropriate credentials to access any URL resource.
025: *
026: * @author James Williams (james.williams@redhat.com)
027: *
028: */
029: public class SvnResourceHandler extends BaseResourceHandler implements
030: ResourceHandler {
031:
032: private String username = "";
033: private String password = "";
034:
035: /*
036: * (non-Javadoc)
037: *
038: * @see org.drools.resource.ResourceHandler#authenticate(java.lang.String)
039: */
040: public boolean authenticate(String url) {
041: return SvnUtil.authenticate(username, password, url);
042: }
043:
044: /*
045: * (non-Javadoc)
046: *
047: * @see org.drools.resource.ResourceHandler#setCredentials(java.lang.String,
048: * java.lang.String)
049: */
050: public void setCredentials(String username, String password) {
051: this .username = username;
052: this .password = password;
053: }
054:
055: /*
056: * (non-Javadoc)
057: *
058: * @see org.drools.resource.ResourceHandler#getResourceStream(org.drools.resource.RepositoryBean)
059: */
060: public ByteArrayOutputStream getResourceStream(
061: RepositoryBean aRepositoryBean)
062: throws ResourceUrlNotFoundException,
063: ResourceTypeNotSupportedException,
064: ResourceAccessDeniedException {
065:
066: String url = new String();
067: ByteArrayOutputStream baos;
068: try {
069: url = getResourceURL(aRepositoryBean);
070: if (!authenticate(url)) {
071: throw new ResourceAccessDeniedException(url,
072: this .username, this .password);
073: }
074:
075: else {
076: baos = SvnUtil.getFileContentsFromSvn(url,
077: this .username, this .password, aRepositoryBean
078: .getVersionInLong());
079: }
080: }
081:
082: catch (SVNException e) {
083: e.printStackTrace();
084: throw new ResourceUrlNotFoundException(url);
085: } catch (ResourceTypeNotSupportedException exc) {
086: throw exc;
087: }
088: return baos;
089: }
090:
091: /*
092: *
093: * @see org.drools.resource.ResourceHandler#getResourceURL(org.drools.resource.RepositoryBean)
094: */
095: public String getResourceURL(RepositoryBean aRepositoryBean)
096: throws ResourceTypeNotSupportedException {
097:
098: StringBuffer urlBuf = new StringBuffer(repositoryUrl);
099: if (aRepositoryBean.getResourceType() == ResourceType.DRL_FILE) {
100: urlBuf.append("/drls/");
101: urlBuf.append(aRepositoryBean.getName());
102: urlBuf.append(".drl");
103: } else if (aRepositoryBean.getResourceType() == ResourceType.FUNCTION) {
104: urlBuf.append("/functions/");
105: urlBuf.append(aRepositoryBean.getName());
106: urlBuf.append(".function");
107: } else if (aRepositoryBean.getResourceType() == ResourceType.RULE) {
108: urlBuf.append("/rules/");
109: urlBuf.append(aRepositoryBean.getName());
110: urlBuf.append(".rule");
111: } else if (aRepositoryBean.getResourceType() == ResourceType.DSL_FILE) {
112: urlBuf.append("/dsls/");
113: urlBuf.append(aRepositoryBean.getName());
114: urlBuf.append(".dsl");
115: } else if (aRepositoryBean.getResourceType() == ResourceType.XLS_FILE) {
116: urlBuf.append("/spreadsheets/");
117: urlBuf.append(aRepositoryBean.getName());
118: urlBuf.append(".xls");
119: } else {
120: throw new ResourceTypeNotSupportedException(urlBuf
121: .toString());
122: }
123:
124: return urlBuf.toString();
125: }
126:
127: public String getPassword() {
128: return password;
129: }
130:
131: public void setPassword(String password) {
132: this .password = password;
133: }
134:
135: public String getUsername() {
136: return username;
137: }
138:
139: public void setUsername(String username) {
140: this .username = username;
141: }
142:
143: public void setRepositoryUrl(String url) {
144: this .repositoryUrl = url;
145: }
146:
147: public String getRepositoryUrl() {
148: return this.repositoryUrl;
149: }
150: }
|