001    /**
002     * Copyright 2010-2013 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.codehaus.mojo.license.header;
017    
018    import org.codehaus.mojo.license.header.transformer.FileHeaderTransformer;
019    import org.nuiton.processor.Processor;
020    
021    import java.io.File;
022    import java.io.FileReader;
023    import java.io.FileWriter;
024    import java.io.IOException;
025    
026    /**
027     * File header processor.
028     *
029     * @author tchemit <chemit@codelutin.com>
030     * @plexus.component role="org.nuiton.processor.Processor" role-hint="file-header"
031     * @since 1.0
032     */
033    public class FileHeaderProcessor
034        extends Processor
035    {
036    
037        /**
038         * processor configuration
039         */
040        protected FileHeaderProcessorConfiguration configuration;
041    
042        /**
043         * internal file header filter
044         */
045        protected FileHeaderFilter filter;
046    
047        public FileHeaderProcessor()
048        {
049        }
050    
051        public FileHeaderProcessorConfiguration getConfiguration()
052        {
053            return configuration;
054        }
055    
056        public FileHeaderFilter getFilter()
057        {
058            return filter;
059        }
060    
061        /**
062         * @return {@code true} if processed file was touched (says the header was
063         *         fully found), {@code false} otherwise
064         * @see FileHeaderFilter#isTouched()
065         */
066        public boolean isTouched()
067        {
068            return getFilter() != null && getFilter().isTouched();
069        }
070    
071        /**
072         * @return {@code true} if processed file was modified (says the header was
073         *         fully found and content changed), {@code false} otherwise
074         * @see FileHeaderFilter#isModified()
075         */
076        public boolean isModified()
077        {
078            return getFilter() != null && getFilter().isModified();
079        }
080    
081        /**
082         * @return {@code true} if header of header was detected
083         * @see FileHeaderFilter#isDetectHeader()
084         */
085        public boolean isDetectHeader()
086        {
087            return getFilter() != null && getFilter().isDetectHeader();
088        }
089    
090        public void process( File filein, File fileout )
091            throws IOException, IllegalStateException
092        {
093    
094            checkInit();
095            reset();
096    
097            FileReader input = new FileReader( filein );
098            try
099            {
100                FileWriter output = new FileWriter( fileout );
101                try
102                {
103                    process( input, output );
104                }
105                finally
106                {
107                    output.close();
108                }
109            }
110            finally
111            {
112                input.close();
113            }
114        }
115    
116        public void populateFilter()
117        {
118            FileHeader fileHeader = getConfiguration().getFileHeader();
119            boolean change = false;
120    
121            FileHeaderFilter filter = getFilter();
122    
123            if ( !fileHeader.equals( filter.getFileHeader() ) )
124            {
125    
126                // change file header
127    
128                filter.setFileHeader( fileHeader );
129                change = true;
130            }
131            FileHeaderTransformer transformer = getConfiguration().getTransformer();
132            if ( !transformer.equals( filter.getTransformer() ) )
133            {
134    
135                // change file transformer
136    
137                filter.setTransformer( transformer );
138                change = true;
139            }
140            if ( change )
141            {
142    
143                // something has changed, must reset content cache
144                filter.resetContent();
145            }
146        }
147    
148        public void setConfiguration( FileHeaderProcessorConfiguration configuration )
149        {
150            this.configuration = configuration;
151        }
152    
153        public void setFilter( FileHeaderFilter filter )
154        {
155            this.filter = filter;
156            setInputFilter( filter );
157        }
158    
159        public void reset()
160        {
161            if ( filter != null )
162            {
163                filter.reset();
164            }
165        }
166    
167        protected FileHeader getFileHeader()
168        {
169            return getConfiguration().getFileHeader();
170        }
171    
172        protected FileHeaderTransformer getTransformer()
173        {
174            return getConfiguration().getTransformer();
175        }
176    
177        protected void checkInit()
178            throws IllegalStateException
179        {
180            if ( getConfiguration() == null )
181            {
182                throw new IllegalStateException( "no configuration set." );
183            }
184            if ( getFileHeader() == null )
185            {
186                throw new IllegalStateException( "no file header set." );
187            }
188            if ( getTransformer() == null )
189            {
190                throw new IllegalStateException( "no file header transformer set." );
191            }
192            if ( getFilter() == null )
193            {
194                throw new IllegalStateException( "no file header filter set." );
195            }
196        }
197    }