vgritsenko    2003/06/10 19:59:36

  Modified:    src/java/org/apache/cocoon Main.java
               src/java/org/apache/cocoon/bean CocoonBean.java
  Log:
  Some rework of the CocoonBean:
   * remove setDest() method
   * Add toString and hashcode to the Target class
   * destDir in Main can be specified either via argument or in the conf file
  
  Revision  Changes    Path
  1.5       +80 -70    cocoon-2.1/src/java/org/apache/cocoon/Main.java
  
  Index: Main.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/Main.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Main.java 4 Jun 2003 19:29:07 -0000       1.4
  +++ Main.java 11 Jun 2003 02:59:36 -0000      1.5
  @@ -55,25 +55,21 @@
   import java.util.List;
   import java.util.ArrayList;
   import java.util.Arrays;
  -import java.util.Iterator;
  +import javax.xml.parsers.DocumentBuilderFactory;
  +import javax.xml.parsers.DocumentBuilder;
   
   import org.w3c.dom.Document;
   import org.w3c.dom.Node;
   import org.w3c.dom.NodeList;
   import org.w3c.dom.NamedNodeMap;
   
  -import javax.xml.parsers.DocumentBuilderFactory;
  -import javax.xml.parsers.DocumentBuilder;
  -
   import org.apache.commons.cli.Options;
   import org.apache.commons.cli.Option;
   import org.apache.commons.cli.CommandLine;
  -import org.apache.commons.cli.CommandLineParser;
   import org.apache.commons.cli.PosixParser;
   import org.apache.commons.cli.HelpFormatter;
   
   import org.apache.cocoon.Constants;
  -
   import org.apache.cocoon.bean.CocoonBean;
   
   /**
  @@ -290,21 +286,24 @@
   
           long startTimeMillis = System.currentTimeMillis();
   
  -        CocoonBean cocoon = new CocoonBean();
  -        String destDir = null;
  -
           Main.setOptions();
  -        CommandLineParser parser = new PosixParser();
  -        CommandLine line = parser.parse( options, args );
  +        CommandLine line = new PosixParser().parse( options, args );
  +        CocoonBean cocoon = new CocoonBean();
   
           if (line.hasOption(HELP_OPT)) {
                printUsage();
  -        }
  -        if (line.hasOption(VERSION_OPT)) {
  +        } else if (line.hasOption(VERSION_OPT)) {
                printVersion();
           }
  +
  +        String destDir = null;
  +        if (line.hasOption(DEST_DIR_OPT)) {
  +            destDir = line.getOptionValue(DEST_DIR_OPT);
  +        }
  +
           if (line.hasOption(XCONF_OPT)) {
  -            Main.processXConf(cocoon, line.getOptionValue(XCONF_OPT));
  +            // destDir from command line overrides one in xconf file
  +            destDir = Main.processXConf(cocoon, line.getOptionValue(XCONF_OPT), 
destDir);
           }
           if (line.hasOption(VERBOSE_OPT)) {
               cocoon.setVerbose(true);
  @@ -312,9 +311,7 @@
           if (line.hasOption(PRECOMPILE_ONLY_OPT)) {
               cocoon.setPrecompileOnly(true);
           }
  -        if (line.hasOption(DEST_DIR_OPT)) {
  -            destDir = line.getOptionValue(DEST_DIR_OPT);
  -        }
  +
           if (line.hasOption(WORK_DIR_OPT)) {
               cocoon.setWorkDir(line.getOptionValue(WORK_DIR_OPT));
           }
  @@ -346,10 +343,10 @@
               
cocoon.setBrokenLinkReportFile(line.getOptionValue(BROKEN_LINK_FILE_OPT));
           }
           if (line.hasOption(URI_FILE_OPT)) {
  -            cocoon.addTargets(processURIFile(line.getOptionValue(URI_FILE_OPT)));
  +            cocoon.addTargets(processURIFile(line.getOptionValue(URI_FILE_OPT)), 
destDir);
           }
           if (line.hasOption(FOLLOW_LINKS_OPT)) {
  -        cocoon.setFollowLinks(yesno(line.getOptionValue(FOLLOW_LINKS_OPT)));
  +            cocoon.setFollowLinks(yesno(line.getOptionValue(FOLLOW_LINKS_OPT)));
           }
           if (line.hasOption(CONFIRM_EXTENSIONS_OPT)) {
               
cocoon.setConfirmExtensions(yesno(line.getOptionValue(CONFIRM_EXTENSIONS_OPT, "yes")));
  @@ -357,9 +354,8 @@
           if (line.hasOption(LOAD_CLASS_OPT)){
               
cocoon.addLoadedClasses(Arrays.asList(line.getOptionValues(LOAD_CLASS_OPT)));
           }
  -        for (Iterator i = line.getArgList().iterator(); i.hasNext();) {
  -            cocoon.addTarget((String)i.next(), destDir);
  -        }
  +
  +        cocoon.addTargets(line.getArgList(), destDir);
   
           System.out.println(getProlog());
           
  @@ -413,15 +409,13 @@
        * @param cocoon a <code>CocoonBean</code> that will be configured by the xconf 
file
        * @param filename a <code>String</code> value
        */
  -    private static void processXConf(CocoonBean cocoon, String filename) {
  +    private static String processXConf(CocoonBean cocoon, String filename, String 
destDir) {
   
           try {
               final DocumentBuilder builder = 
DocumentBuilderFactory.newInstance().newDocumentBuilder();
  -
               final Document conf = builder.parse(new 
File(filename).toURL().toExternalForm());
   
               Node root = conf.getDocumentElement();
  -
               if (!NODE_ROOT.equals(root.getNodeName())) {
                   throw new IllegalArgumentException("Expected root node of "+ 
NODE_ROOT);
               }
  @@ -438,9 +432,13 @@
               if (Main.hasAttribute(root, ATTR_CONFIRM_EXTENSIONS)) {
                   cocoon.setConfirmExtensions(Main.getBooleanAttributeValue(root, 
ATTR_CONFIRM_EXTENSIONS));
               }
  -            NodeList nodes = root.getChildNodes();
   
  -            for (int i=0; i<nodes.getLength();i++) {
  +            if (destDir == null || destDir.length() == 0) {
  +                destDir = getNodeValue(root, NODE_DEST_DIR);
  +            }
  +
  +            NodeList nodes = root.getChildNodes();
  +            for (int i = 0; i < nodes.getLength(); i++) {
                   Node node = nodes.item(i);
                   if (node.getNodeType()== Node.ELEMENT_NODE) {
                       String nodeName = node.getNodeName();
  @@ -460,7 +458,7 @@
                           cocoon.setConfigFile(getNodeValue(node));
   
                       } else if (nodeName.equals(NODE_DEST_DIR)) {
  -                        cocoon.setDestDir(getNodeValue(node));
  +                        // Ignore
   
                       } else if (nodeName.equals(NODE_WORK_DIR)) {
                           cocoon.setWorkDir(getNodeValue(node));
  @@ -475,20 +473,21 @@
                           cocoon.setDefaultFilename(getNodeValue(node));
   
                       } else if (nodeName.equals(NODE_URI)) {
  -                        Main.parseURINode(cocoon, node);
  +                        Main.parseURINode(cocoon, node, destDir);
   
                       } else if (nodeName.equals(NODE_URI_FILE)) {
  -                        cocoon.addTargets(Main.processURIFile(getNodeValue(node)));
  +                        cocoon.addTargets(Main.processURIFile(getNodeValue(node)), 
destDir);
   
                       } else {
                           throw new IllegalArgumentException("Unknown element: " + 
nodeName);
                       }
                   }
               }
  -
           } catch (Exception e) {
               System.out.println("ERROR: "+e.getMessage());
           }
  +
  +        return destDir;
       }
   
       private static void parseLoggingNode(CocoonBean cocoon, Node node) throws 
IllegalArgumentException {
  @@ -525,45 +524,55 @@
               throw new IllegalArgumentException("Unexpected children of 
"+NODE_LOGGING+" node");
           }
       }
  -    private static void parseURINode(CocoonBean cocoon, Node node) throws 
IllegalArgumentException {
  -        String type = null;
  -        String root = null;
  -        String src = null;
  -        String dest = null;
  -
  -        if (node.getAttributes().getLength()==0) {
  -            cocoon.addTarget(getNodeValue(node));
  -            return;
  -        }
  -        if (Main.hasAttribute(node, ATTR_URI_TYPE)) {
  -            type = Main.getAttributeValue(node, ATTR_URI_TYPE);
  -        }
  -        if (Main.hasAttribute(node, ATTR_URI_SOURCEPREFIX)) {
  -            root = Main.getAttributeValue(node, ATTR_URI_SOURCEPREFIX);
  -        }
  -        if (Main.hasAttribute(node, ATTR_URI_DESTURI)) {
  -            dest = Main.getAttributeValue(node, ATTR_URI_DESTURI);
  -        }
  -        if (Main.hasAttribute(node, ATTR_URI_SOURCEURI)) {
  -            src = Main.getAttributeValue(node, ATTR_URI_SOURCEURI);
  -        } else {
  -            throw new IllegalArgumentException("Missing src attribute on uri node");
  +
  +    private static void parseURINode(CocoonBean cocoon, Node node, String destDir) 
throws IllegalArgumentException {
  +        NodeList nodes = node.getChildNodes();
  +        if (nodes.getLength() != 0) {
  +            throw new IllegalArgumentException("Unexpected children of <" + 
NODE_LOGGING + "> node");
           }
  -        if (src == null) {
  -            throw new IllegalArgumentException("Missing src attribute in <uri> 
node");
  -        } else if (root != null && type!=null & dest!=null) {
  -            cocoon.addTarget(type, root, src, dest);
  -        } else if (root!=null & dest!=null) {
  -            cocoon.addTarget(root, src, dest);
  -        } else if (dest!=null) {
  -            cocoon.addTarget(src, dest);
  +
  +        if (node.getAttributes().getLength() == 0) {
  +            cocoon.addTarget(getNodeValue(node), destDir);
           } else {
  -            cocoon.addTarget(src);
  +            String src = Main.getAttributeValue(node, ATTR_URI_SOURCEURI);
  +
  +            String type = null;
  +            if (Main.hasAttribute(node, ATTR_URI_TYPE)) {
  +                type = Main.getAttributeValue(node, ATTR_URI_TYPE);
  +            }
  +            String root = null;
  +            if (Main.hasAttribute(node, ATTR_URI_SOURCEPREFIX)) {
  +                root = Main.getAttributeValue(node, ATTR_URI_SOURCEPREFIX);
  +            }
  +            String dest = null;
  +            if (Main.hasAttribute(node, ATTR_URI_DESTURI)) {
  +                dest = Main.getAttributeValue(node, ATTR_URI_DESTURI);
  +            }
  +
  +            if (root != null && type != null & dest != null) {
  +                cocoon.addTarget(type, root, src, dest);
  +            } else if (root != null & dest != null) {
  +                cocoon.addTarget(root, src, dest);
  +            } else if (dest != null) {
  +                cocoon.addTarget(src, dest);
  +            } else {
  +                cocoon.addTarget(src, destDir);
  +            }
           }
  -        NodeList nodes = node.getChildNodes();
  -        if (nodes.getLength()!=0) {
  -            throw new IllegalArgumentException("Unexpected children of 
"+NODE_LOGGING+" node");
  +    }
  +
  +    private static String getNodeValue(Node root, String name) throws 
IllegalArgumentException {
  +        NodeList nodes = root.getChildNodes();
  +        for (int i = 0; i < nodes.getLength(); i++) {
  +            Node node = nodes.item(i);
  +            if (node.getNodeType()== Node.ELEMENT_NODE) {
  +                String nodeName = node.getNodeName();
  +                if (nodeName.equals(name)) {
  +                    return getNodeValue(node);
  +                }
  +            }
           }
  +        return null;
       }
   
       private static String getNodeValue(Node node) throws IllegalArgumentException {
  @@ -571,7 +580,7 @@
           NodeList children = node.getChildNodes();
           boolean found = false;
   
  -        for (int i=0; i< children.getLength(); i++) {
  +        for (int i = 0; i < children.getLength(); i++) {
               Node child = children.item(i);
               if (child.getNodeType() == Node.TEXT_NODE) {
                   s.append(child.getNodeValue());
  @@ -590,11 +599,11 @@
           NamedNodeMap nodes = node.getAttributes();
           if (nodes != null) {
               Node attribute = nodes.getNamedItem(attr);
  -            if (attribute != null) {
  +            if (attribute != null && attribute.getNodeValue() != null) {
                   return attribute.getNodeValue();
               }
           }
  -        throw new IllegalArgumentException("Missing "+attr+" attribute");
  +        throw new IllegalArgumentException("Missing " + attr + " attribute on <" + 
node.getNodeName() + "> node");
       }
   
       private static boolean hasAttribute(Node node, String attr) {
  @@ -605,6 +614,7 @@
           }
           return false;
       }
  +
       private static boolean getBooleanAttributeValue(Node node, String attr) {
           NamedNodeMap nodes = node.getAttributes();
           if (nodes != null) {
  
  
  
  1.10      +91 -96    cocoon-2.1/src/java/org/apache/cocoon/bean/CocoonBean.java
  
  Index: CocoonBean.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/bean/CocoonBean.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- CocoonBean.java   6 Jun 2003 12:21:10 -0000       1.9
  +++ CocoonBean.java   11 Jun 2003 02:59:36 -0000      1.10
  @@ -143,7 +143,6 @@
       // Internal Objects
       private CommandLineContext cliContext;
       private Cocoon cocoon;
  -    private String destDir;
       private static Logger log;
       private Map attributes;
       private HashMap empty;
  @@ -162,12 +161,6 @@
       public void initialize() throws Exception {
           // @todo@ when does the logger get initialised? uv
           // @todo@ these should log then throw exceptions back to the caller, not 
use system.exit()
  -        if (destDir.equals("")) {
  -            String error = "Careful, you must specify a destination dir when using 
the -d/--destDir argument";
  -            log.fatalError(error);
  -            System.out.println(error);
  -            System.exit(1);
  -        }
   
           if (contextDir.equals("")) {
               String error = "Careful, you must specify a configuration file when 
using the -c/--contextDir argument";
  @@ -288,12 +281,11 @@
       /**
        * Try loading the configuration file from a single location
        */
  -    private static File tryConfigurationFile(String filename) throws IOException {
  -        File conf;
  +    private static File tryConfigurationFile(String filename) {
           if (log.isDebugEnabled()) {
               log.debug("Trying configuration file at: " + filename);
           }
  -        conf = new File(filename);
  +        File conf = new File(filename);
           if (conf.canRead()) {
               return conf;
           } else {
  @@ -405,10 +397,6 @@
           this.workDir = workDir;
       }
   
  -    public void setDestDir(String destDir) {
  -        this.destDir = destDir;
  -    }
  -
       public void setConfigFile(String configFile) {
           this.configFile = configFile;
       }
  @@ -465,26 +453,35 @@
           this.classList.addAll(classList);
       }
   
  -    public void addTarget(String sourceURI) {
  -        targets.add(new Target(sourceURI, destDir));
  -    }
  -
  -    public void addTarget(String type, String root, String sourceURI, String 
destURI){
  +    /**
  +     * Adds a target for processing
  +     *
  +     * @param type Type of target - append, replace, insert.
  +     * @param root
  +     * @param sourceURI URI of the starting page
  +     * @param destURI URI specifying destination for the generated pages.
  +     * @throws IllegalArgumentException if destURI is missing
  +     */
  +    public void addTarget(String type, String root, String sourceURI, String 
destURI)
  +            throws IllegalArgumentException {
           targets.add(new Target(type, root, sourceURI, destURI));
       }
   
  -    public void addTarget(String type, String sourceURI, String destURI){
  +    public void addTarget(String type, String sourceURI, String destURI)
  +            throws IllegalArgumentException {
           targets.add(new Target(type, sourceURI, destURI));
       }
   
  -    public void addTarget(String sourceURI, String destURI){
  +    public void addTarget(String sourceURI, String destURI)
  +            throws IllegalArgumentException {
           targets.add(new Target(sourceURI, destURI));
       }
   
  -    public void addTargets(List uris) {
  +    public void addTargets(List uris, String destURI)
  +            throws IllegalArgumentException {
           Iterator i = uris.iterator();
           while (i.hasNext()) {
  -            Target target = new Target((String)i.next(), destDir);
  +            Target target = new Target((String)i.next(), destURI);
               targets.add(target);
           }
       }
  @@ -573,37 +570,31 @@
           if (!initialized){
               initialize();
           }
  +
           attributes = new HashMap();
           empty = new HashMap();
           allProcessedLinks = new HashMap();
           allTranslatedLinks = new HashMap();
   
  -        int nCount = 0;
  -        Target target;
  -
  -        HashMap targetMap = new java.util.HashMap();
  +        Map targetMap = new HashMap();
           Iterator i = targets.iterator();
           while (i.hasNext()) {
  -            target = (Target)i.next();
  -            if (!targetMap.containsKey(target.getHashCode())) {
  -                targetMap.put(target.getHashCode(), target);
  -            }
  +            Target target = (Target)i.next();
  +            targetMap.put(target, target);
           }
   
  +        int nCount = 0;
           while (targetMap.size() > 0) {
  -            String hashCode = (String)(new ArrayList(targetMap.keySet()).get(0));
  -            target = (Target)targetMap.get(hashCode);
  +            Target target = (Target)targetMap.keySet().iterator().next();
               try {
  -                if (allProcessedLinks.get(hashCode) == null) {
  +                if (!allProcessedLinks.containsKey(target)) {
                       if (precompileOnly) {
  -                        this.processXSP(target.getSourceURI());
  +                        processXSP(target.getSourceURI());
                       } else if (this.followLinks) {
                           i = processTarget(target).iterator();
                           while (i.hasNext()) {
                               target = (Target)i.next();
  -                            if (!targetMap.containsKey(target.getHashCode())) {
  -                                targetMap.put(target.getHashCode(), target);
  -                            }
  +                            targetMap.put(target, target);
                           }
                       } else {
                           processTarget(target);
  @@ -613,7 +604,7 @@
                   printBroken (target.getSourceURI(), rnfe.getMessage());
               }
   
  -            targetMap.remove(target.getHashCode());
  +            targetMap.remove(target);
               nCount++;
   
               if (log.isInfoEnabled()) {
  @@ -626,7 +617,6 @@
               recursivelyPrecompile(context, context);
           }
           outputBrokenLinks();
  -
       }
   
       /**
  @@ -711,6 +701,7 @@
        *       processing continues until all processing is complete
        *   </li>
        * </ul>
  +     *
        * @param target a <code>Target</code> target to process
        * @return a <code>Collection</code> containing all links found, as
        * Target objects.
  @@ -757,7 +748,7 @@
               filename = suri;
           }
           // Store processed URI list to avoid eternal loop
  -        allProcessedLinks.put(target.getHashCode(),target);
  +        allProcessedLinks.put(target, target);
   
           if ("".equals(filename)) {
               return new ArrayList();
  @@ -1161,15 +1152,17 @@
               File[] libraries = root.listFiles();
               Arrays.sort(libraries);
               for (int i = 0; i < libraries.length; i++) {
  -                // FIXME: endsWith(".jar") or .zip
  -                buildClassPath.append(File.pathSeparatorChar)
  -                              .append(IOUtils.getFullFilename(libraries[i]));
  +                if (libraries[i].getAbsolutePath().endsWith(".jar")) {
  +                    buildClassPath.append(File.pathSeparatorChar)
  +                                  .append(IOUtils.getFullFilename(libraries[i]));
  +                }
               }
           }
   
           buildClassPath.append(File.pathSeparatorChar)
                         .append(System.getProperty("java.class.path"));
   
  +        // Extra class path is necessary for non-classloader-aware java compilers 
to compile XSPs
   //        buildClassPath.append(File.pathSeparatorChar)
   //                      .append(getExtraClassPath(context));
   
  @@ -1180,31 +1173,41 @@
       }
   
       public class Target {
  -        private static final String DEFAULT_TYPE = "default";
  -        private static final String REPLACE_TYPE = "replace";
  +        // Defult type is append
           private static final String APPEND_TYPE = "append";
  +        private static final String REPLACE_TYPE = "replace";
           private static final String INSERT_TYPE = "insert";
  -        private String type;
  -        private String root;
  -        private String sourceURI;
  -        private String destURI;
   
  -        public Target(String type, String root, String sourceURI, String destURI){
  +        private final String type;
  +        private final String root;
  +        private final String sourceURI;
  +        private final String destURI;
  +
  +        private transient int _hashCode;
  +        private transient String _toString;
  +
  +        public Target(String type, String root, String sourceURI, String destURI) 
throws IllegalArgumentException {
               this.type = type;
               this.root = root;
               this.sourceURI = NetUtils.normalize(sourceURI);
  +            if (destURI == null || destURI.length() == 0) {
  +                throw new IllegalArgumentException("You must specify a destination 
directory when defining a target");
  +            }
  +            if (!destURI.endsWith("/")) {
  +                destURI += "/";
  +            }
               this.destURI = destURI;
           }
   
  -        public Target(String type, String sourceURI, String destURI){
  +        public Target(String type, String sourceURI, String destURI) throws 
IllegalArgumentException {
               this(type, "", sourceURI, destURI);
           }
   
  -        public Target(String sourceURI, String destURI){
  -            this(DEFAULT_TYPE, "", sourceURI, destURI);
  +        public Target(String sourceURI, String destURI) throws 
IllegalArgumentException {
  +            this(APPEND_TYPE, "", sourceURI, destURI);
           }
   
  -        public Target getDerivedTarget(String newURI) throws ProcessingException {
  +        public Target getDerivedTarget(String newURI) throws 
IllegalArgumentException {
               if (!newURI.startsWith(root)) {
                   return null;
               }
  @@ -1218,62 +1221,54 @@
               }
               actualSourceURI = actualSourceURI.substring(root.length());
   
  -            if (DEFAULT_TYPE.equals(this.type)){
  -                return this.getFinalURIWithDefault(actualSourceURI);
  -            }
  -            else if (REPLACE_TYPE.equals(this.type)){
  -                return this.getFinalURIWithReplace(actualSourceURI);
  -            }
  -            else if (APPEND_TYPE.equals(this.type)){
  -                return this.getFinalURIWithAppend(actualSourceURI);
  -            }
  -            else if (INSERT_TYPE.equals(this.type)){
  -                return this.getFinalURIWithInsert(actualSourceURI);
  +            if (APPEND_TYPE.equals(this.type)){
  +                return destURI + actualSourceURI;
  +            } else if (REPLACE_TYPE.equals(this.type)){
  +                return destURI;
  +            } else if (INSERT_TYPE.equals(this.type)){
  +                int starPos = destURI.indexOf("*");
  +                if (starPos == -1) {
  +                    throw new ProcessingException("Missing * in replace mapper 
uri");
  +                } else if (starPos == destURI.length()-1) {
  +                   return destURI.substring(0,starPos) + actualSourceURI;
  +                } else {
  +                    return destURI.substring(0,starPos) + actualSourceURI + 
destURI.substring(starPos+1);
  +                }
               } else {
                   throw new ProcessingException("Unknown mapper type: " + this.type);
               }
           }
   
  -        private String getFinalURIWithDefault(String actualSourceURI){
  -            return destDir + "/" + actualSourceURI;
  -        }
  -
  -        private String getFinalURIWithAppend(String actualSourceURI){
  -            return destURI + actualSourceURI;
  -        }
  -
  -        private String getFinalURIWithReplace(String actualSourceURI){
  -            return destURI;
  -        }
  -
  -        private String getFinalURIWithInsert(String actualSourceURI) throws 
ProcessingException {
  -            int starPos = destURI.indexOf("*");
  -            if (starPos == -1) {
  -                throw new ProcessingException("Missing * in replace mapper uri");
  -            } else if (starPos == destURI.length()-1) {
  -               return destURI.substring(0,starPos) + actualSourceURI;
  -            } else {
  -                return destURI.substring(0,starPos) + actualSourceURI + 
destURI.substring(starPos+1);
  -            }
  -        }
  -
           public String getSourceURI() {
               return root + sourceURI;
           }
   
  -        // @todo@ this is misusing the 'hashCode' name - hashCodes should be 
integer it seems, uv
  -        public String getHashCode() {
  -            return type + "|" + root +"|" + sourceURI + "|" + destURI;
  -        }
  -
           public OutputStream getOutputStream(String filename) throws IOException, 
ProcessingException {
               final String finalDestinationURI = this.getFinalURI(filename);
  -            Source src = (Source) sourceResolver.resolveURI(finalDestinationURI);
  +            Source src = sourceResolver.resolveURI(finalDestinationURI);
               if (!(src instanceof ModifiableSource)) {
                   throw new ProcessingException("Source is not Modifiable: " + 
finalDestinationURI);
               }
               ModifiableSource outputSource = (ModifiableSource) src;
               return outputSource.getOutputStream();
  +        }
  +
  +        public boolean equals(Object o) {
  +            return (o instanceof Target) && o.toString().equals(toString());
  +        }
  +
  +        public int hashCode() {
  +            if (_hashCode == 0) {
  +                return _hashCode = toString().hashCode();
  +            }
  +            return _hashCode;
  +        }
  +
  +        public String toString() {
  +            if (_toString == null) {
  +                return _toString = "<" + type + "|" + root +"|" + sourceURI + "|" + 
destURI + ">";
  +            }
  +            return _toString;
           }
       }
   }
  
  
  

Reply via email to